home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 41 / Amiga Format CD41 (1999-06)(Future Publishing)(GB)[!][issue 1999-07].iso / -seriously_amiga- / graphics / picfx / e-source / picfx.e < prev   
Text File  |  1999-04-19  |  121KB  |  2,827 lines

  1. OPT PREPROCESS,LARGE,OSVERSION=39
  2. #define PlaneFuncObject NewObjectA(cl_planefunc.mcc_class,NIL,[TAG_IGNORE,0
  3. #define ProjectListObject NewObjectA(cl_projectlist.mcc_class,NIL,[TAG_IGNORE,0
  4. #define uSliderObject NewObjectA(cl_uslider.mcc_class,NIL,[TAG_IGNORE,0
  5. #define SizeTextObject NewObjectA(cl_sizetxt.mcc_class,NIL,[TAG_IGNORE,0
  6. #define MyApplicationObject NewObjectA(cl_myapp.mcc_class,NIL,[TAG_IGNORE,0
  7.  
  8. #define label(t) TextObject,MUIA_Text_Contents,t,MUIA_Text_SetMax,MUI_TRUE,End
  9.  
  10. #define modt(val) val AND $FF
  11.  
  12. #define PICVERSION 'PicFX alpha 0.86'
  13. #define FULLVERSION '$VER: PicFX alpha 0.86 (10/04/99)'
  14.  
  15. MODULE 'afc/super_picture','afc/trueBitmap' -> To Be Removed
  16. MODULE       'amigalib/boopsi','amigalib/lists',
  17.        'asl',
  18.        'datatypes','datatypes/datatypes','datatypes/pictureclass','datatypes/pictureclassext','datatypes/datatypesclass',
  19.        'devices/timer',
  20.        'dos/dos','dos/dosextens','dos/dostags',
  21.        'exec/io','exec/lists','exec/memory','exec/nodes','exec/ports','exec/semaphores','exec/tasks',
  22.        'graphics/gfx','graphics/rastport','graphics/view',
  23.            'cybergraphics','picasso96api',
  24.        'intuition/classes','intuition/classusr','intuition/intuition','intuition/screens',
  25.        'libraries/asl','libraries/cybergraphics','libraries/gadtools','libraries/mui',
  26.            'libraries/muip','libraries/picasso96',
  27.        'mui/muicustomclass',
  28.        'muimaster',
  29.        'utility','utility/tagitem',
  30.        '*parser','tools/longreal',
  31.        'mui/lamp_mcc','mui/SettingsWindow_mcc',
  32.        '*picFXlocale'
  33.  
  34. MODULE 'tools/debug' ->kputfmt(formatstring,[values])
  35.  
  36. CONST TICKS_PER_MINUTE = TICKS_PER_SECOND*60
  37.  
  38. DEF app,
  39.     messages_win,messages_lst,
  40.     prefs_win,mainpri_sld,renderpri_sld,renderupdate_sld,mui_btn,
  41.         currpri_sld,close_cyc,
  42.     settings_win,colour_txt,
  43.     opened_lsv,opened_lst,
  44.     new_btn,prefs_btn,
  45.     sgroup, /*settings gadgets*/
  46.     name_str,type_reg,
  47.         path_str,size_rad,size_txt, -> for the DTPic type
  48.         r_lbl,g_lbl,b_lbl,
  49.         red_str,green_str,blue_str,outr_cyc,outg_cyc,outb_cyc, -> for the Function type
  50.         red_fail,green_fail,blue_fail,
  51.     width_str,height_str,
  52.             /*action buttons*/
  53.     draw_btn,savepic_btn,savefunc_btn,abort_btn,showme_cyc,close_btn,
  54.     loadfunc_btn,clear_btn,
  55.             /*state area*/
  56.     lamp_lmp,state_txt,state_gau,
  57.  
  58.     ftype_registertitles,size_radiolabels,showme_cyclelabels,
  59.     sigs=0,
  60.     lastid=0,/* lastid is a global variable incremented everytime a project is opened.
  61.                 absolutely no risk to have several projects with same ID*/
  62.     title[15]:STRING,counter=1, -> number of messages
  63.     messages[15]:ARRAY OF LONG,
  64.  
  65.     cat:PTR TO catalog_picFX,
  66.  
  67.     rp=-2,cp=-1,        -> Priorities
  68.     rupd=10,wclose,     -> Render update and Pwindow-close settings
  69.     psema:ss,           -> Semaphore for preferences  (!!)
  70.  
  71.     currid=-1,quiet=FALSE     -> currid contains the id of the currently selected project. Quiet controls attributes refreshing.
  72.  
  73. DEF nodraw,friend=NIL
  74.  
  75. ENUM SETID_MainP=1,
  76.      SETID_RenderP,
  77.      SETID_CurrP,
  78.      SETID_RUpd,
  79.      SETID_Close
  80.  
  81. DEF cl_planefunc:PTR TO mui_customclass
  82. DEF cl_projectlist:PTR TO mui_customclass
  83. DEF cl_uslider:PTR TO mui_customclass
  84. DEF cl_sizetxt:PTR TO mui_customclass
  85. DEF cl_myapp:PTR TO mui_customclass
  86.  
  87. /*Registation Number:FCB96172; I take FCB9 as base... :(*/
  88. ENUM MUIA_PlaneFunc_Bstr=$FCB90000, -> String of the B function
  89.      MUIA_PlaneFunc_Fail,           -> $RGB:How decoding went..
  90.      MUIA_PlaneFunc_Gstr,           -> ..Its string
  91.      MUIA_PlaneFunc_Height,         -> Height of the object
  92.      MUIA_PlaneFunc_ImageFile,      -> FileName of the image to load
  93.      MUIA_PlaneFunc_Left,
  94.      MUIA_PlaneFunc_Loading,        -> TRUE/FALSE
  95.      MUIA_PlaneFunc_LoadM,          -> Way of loading an image, concerning the size
  96.      MUIA_PlaneFunc_Lock,           -> Allows to read/write lock the instance of the class
  97.      MUIA_PlaneFunc_Name,           -> Name of the graph
  98.      MUIA_PlaneFunc_Percent,        -> Percentage of current work done.
  99.      MUIA_PlaneFunc_OutputR,        -> values: OUT_Integer,OUT_Float32 or OUT_Float64,...
  100.      MUIA_PlaneFunc_OutputG,        -> ... or OUT_OldR,OUT_OldG,OUT_OldB,...
  101.      MUIA_PlaneFunc_OutputB,        -> ... or Out_CopyR,OUT_CopyG (!)
  102.      MUIA_PlaneFunc_ProjectID,      -> Used by ProjectList class, it is the ID of the object
  103.      MUIA_PlaneFunc_ProjectNode,    -> Address of the node in the exec_list of opened_lst
  104.      MUIA_PlaneFunc_Quiet,          -> Width/Height changes won't resize the window if non-zero
  105.      MUIA_PlaneFunc_Rstr,           -> Its string
  106.      MUIA_PlaneFunc_State,
  107.      MUIA_PlaneFunc_Top,
  108.      MUIA_PlaneFunc_Type,           -> Type of graph
  109.      MUIA_PlaneFunc_Width           -> Width of the object
  110.  
  111. ENUM MUIM_PlaneFunc_Abort=$FCB90800,-> Aborts Rendering SubTask
  112.      MUIM_PlaneFunc_Clear,          -> Clears bitmap
  113.      MUIM_PlaneFunc_Close,          -> React after a click on the close button.
  114.      MUIM_PlaneFunc_Lamps,          -> This updates the failure lamps of the functions.
  115.      MUIM_PlaneFunc_LoadFunc,       -> Loads a function from disk
  116.      MUIM_PlaneFunc_Render,         -> Launches/pauses the rendering subtask
  117.      MUIM_PlaneFunc_SaveFunc,       -> Saves the function to disk
  118.      MUIM_PlaneFunc_SavePic,        -> Saves the picture to disk, as an ILBM image
  119.      MUIM_PlaneFunc_SetTaskPri,     -> Sets the priority of the subtask
  120.      MUIM_PlaneFunc_Update          -> sent by the subtask, to update the picture display
  121.  
  122. CONST MUIV_PlaneFunc_Type_DTPic=1,
  123.       MUIV_PlaneFunc_Type_Graph=2,
  124.  
  125.       MUIV_PlaneFunc_LoadM_Scale=1,
  126.       MUIV_PlaneFunc_LoadM_CutTile=2,
  127.       MUIV_PlaneFunc_LoadM_ChangeSize=3,
  128.  
  129.       MUIV_PlaneFunc_State_Idle=0,   ->free
  130.       MUIV_PlaneFunc_State_Drawing=1,->busy
  131.       MUIV_PlaneFunc_State_Paused=2, ->busy but paused
  132.       MUIV_PlaneFunc_State_Frozen=3, ->free but being read
  133.       MUIV_PlaneFunc_State_Loading=4,->loading picture
  134.  
  135.       MUIV_PlaneFunc_Lock_Write=-1, -> Want to lock it in write mode, so nobody else may touch the object
  136.       MUIV_PlaneFunc_Lock_NoWrite=0,-> remove writelock
  137.       MUIV_PlaneFunc_Lock_Read=1,   -> Want to lock it in read mode, only reading is now allowed. Nesting counter!
  138.       MUIV_PlaneFunc_Lock_NoRead=0, -> remove one readlock
  139.  
  140.       MUIV_PlaneFunc_Abort_Finish=1,-> Aborted because rendering finished
  141.       MUIV_PlaneFunc_Abort_Abort=2, -> Aborted because user asked
  142.       MUIV_PlaneFunc_Abort_NoLoad=3 -> Aborted because picture could not be loaded
  143.  
  144. ENUM MUIM_ProjectList_DelItem=$FCB91800,-> Closes the current project if possible (i.e. if it isn't read-locked)
  145.      MUIM_ProjectList_Exit,             -> This aborts all currently running projects and quits the application
  146.      MUIM_ProjectList_Forward,          -> Forwards the method (no args!) to the current project
  147.      MUIM_ProjectList_Memory,           -> Shows available memory in title bar.
  148.      MUIM_ProjectList_NewItem,          -> Adds an item in the list
  149.      MUIM_ProjectList_Notify,           -> Sends a notification information to the current project
  150.      MUIM_ProjectList_Prefs,            -> writes a new value in a preference variable
  151.      MUIM_ProjectList_Refresh,          -> Refreshes the user interface according to the select item
  152.      MUIM_ProjectList_SetPri,           -> Set the priority of a task (see MUIV_~)
  153.      MUIM_ProjectList_ShowMe            -> Sets the MUIA_Window_Open of the current project
  154.  
  155. ENUM MUIV_ProjectList_Notify_Name=1,    /*gadget that has been changed*/
  156.      MUIV_ProjectList_Notify_Type,
  157.      MUIV_ProjectList_Notify_ImageFile,
  158.      MUIV_ProjectList_Notify_LoadM,
  159.      MUIV_ProjectList_Notify_Red,
  160.      MUIV_ProjectList_Notify_Green,
  161.      MUIV_ProjectList_Notify_Blue,
  162.      MUIV_ProjectList_Notify_OutputR,
  163.      MUIV_ProjectList_Notify_OutputG,
  164.      MUIV_ProjectList_Notify_OutputB,
  165.      MUIV_ProjectList_Notify_Width,
  166.      MUIV_ProjectList_Notify_Height
  167.  
  168. ENUM MUIV_ProjectList_SetPri_Main=0,
  169.      MUIV_ProjectList_SetPri_Render,
  170.      MUIV_ProjectList_SetPri_Curr
  171.  
  172. CONST MUIA_uSlider_Stringify=$FCB92000
  173.  
  174. ENUM MUIM_uSlider_Bigger=$FCB92800,
  175.      MUIM_uSlider_Smaller
  176.  
  177. ENUM STC_STARTUP=-2,
  178.     STC_SHUTDOWN,      /*messages to the subtask*/
  179.     STC_START,
  180.     STC_PAUSE,
  181.     STC_RESTART,
  182.     STC_CHANGEDONE
  183. /***************************************************************
  184. **            Custom PlaneFunc private Class                  **
  185. ****************************************************************
  186. This class is responsible for rendering the functions. It uses a
  187. subtask to avoid the main program to be freezed during rendering
  188. ***************************************************************/
  189.  
  190. OBJECT empty_data -> class(es) that doesn't use any data
  191.     nothing
  192. ENDOBJECT
  193.  
  194. OBJECT projectList_data
  195.     exec_list:PTR TO lh -> list of the opened projects
  196. /* Stuff for timer (title bar) */
  197. /* Everything is copied from mui demo "inputhandler" Thanks for its authors ;-) */
  198.     title:PTR TO CHAR
  199.     port:PTR TO mp
  200.     req:PTR TO timerequest
  201.     ihnode:mui_inputhandlernode_timer
  202. ENDOBJECT
  203.  
  204. OBJECT uslider_data
  205.     buffer:PTR TO CHAR
  206.     stringify
  207. ENDOBJECT
  208.  
  209. OBJECT args_compare -> MUIM_uSlider_Bigger/Smaller
  210.     id
  211.     than
  212. ENDOBJECT
  213.  
  214. OBJECT args_abort -> Used by MUIM_PlaneFunc_Abort
  215.     id
  216.     reason
  217. ENDOBJECT
  218.  
  219. OBJECT args_ctp -> MUIM_PlaneFunc_SetTaskPri
  220.     id
  221.     value
  222. ENDOBJECT
  223.  
  224. OBJECT args_notify -> Used by MUIM_ProjectList_Notify
  225.     id
  226.     gadget -> MUIV_ProjectList_Notify_<something>
  227.     value
  228. ENDOBJECT
  229.  
  230. OBJECT args_showme -> Used by MUIM_ProjectList_ShowMe
  231.     id
  232.     value
  233. ENDOBJECT
  234.  
  235. OBJECT args_forward -> Used by MUIM_ProjectList_Forward
  236.     id
  237.     method
  238. ENDOBJECT
  239.  
  240. OBJECT args_prefs -> MUIM_ProjectList_Prefs
  241.     id
  242.     var:PTR TO LONG
  243.     value
  244. ENDOBJECT
  245.  
  246. OBJECT args_refresh -> Used by MUIM_ProjectList_Refresh
  247.     id
  248.     ostate -> TRUE if only the 'state' field must be refreshed.
  249. ENDOBJECT
  250.  
  251. OBJECT args_setpri -> MUIM_ProjectList_SetPri
  252.     id
  253.     task -> MUIV_ProjectList_SetPri_*
  254.     value
  255. ENDOBJECT
  256.  
  257. PROC planeFunc_dispatcher(cl:PTR TO iclass,obj,msg:PTR TO msg)
  258. DEF methodid
  259.     methodid:=msg.methodid
  260.     SELECT methodid
  261.     CASE OM_NEW;        RETURN planeFunc_new(cl,obj,msg)
  262.     CASE OM_DISPOSE;    RETURN planeFunc_dispose(cl,obj,msg)
  263.     CASE OM_GET;        RETURN planeFunc_get(cl,obj,msg)   /*gets an attribute*/
  264.     CASE OM_SET;        RETURN planeFunc_set(cl,obj,msg)   /*sets an attribute*/
  265.     CASE MUIM_AskMinMax;RETURN planeFunc_askminmax(cl,obj,msg)
  266.     CASE MUIM_Cleanup;  RETURN planeFunc_cleanup(cl,obj,msg)
  267.     CASE MUIM_Draw;     RETURN planeFunc_draw(cl,obj,msg)  /*mui (or the subtask) asked to redraw*/
  268.     CASE MUIM_HandleInput;RETURN planeFunc_handleinput(cl,obj,msg)
  269.     CASE MUIM_Setup;    RETURN planeFunc_setup(cl,obj,msg)
  270.  
  271.     CASE MUIM_PlaneFunc_Abort;      RETURN planeFunc_abort(cl,obj,msg)      /*public methods...*/
  272.     CASE MUIM_PlaneFunc_Clear;      RETURN planeFunc_clear(cl,obj/*,msg*/)
  273.     CASE MUIM_PlaneFunc_Close;      RETURN planeFunc_close(cl,obj/*,msg*/)
  274.     CASE MUIM_PlaneFunc_Lamps;      RETURN planeFunc_lamps(cl,obj/*,msg*/)
  275.     CASE MUIM_PlaneFunc_LoadFunc;   RETURN planeFunc_loadfunc(cl,obj/*,msg*/)
  276.     CASE MUIM_PlaneFunc_Render;     RETURN planeFunc_render(cl,obj/*,msg*/)
  277.     CASE MUIM_PlaneFunc_SaveFunc;   RETURN planeFunc_savefunc(cl,obj/*,msg*/)
  278.     CASE MUIM_PlaneFunc_SavePic;    RETURN planeFunc_savepic(/*cl,obj,msg*/)
  279.     CASE MUIM_PlaneFunc_SetTaskPri; RETURN planeFunc_settaskpri(cl,obj,msg)
  280.     CASE MUIM_PlaneFunc_Update;     RETURN planeFunc_update(cl,obj/*,msg*/)
  281.     ENDSELECT
  282. ENDPROC doSuperMethodA(cl,obj,msg)
  283.  
  284. PROC planeFunc_new(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO msg)
  285. DEF data:PTR TO planeFunc_data
  286.     IF (obj:=doSuperMethodA(cl,obj,msg))=NIL THEN RETURN 0
  287.     data:=INST_DATA(cl,obj)
  288.  
  289.     data.self:=obj
  290.     data.app:=app
  291.     InitSemaphore(data.sema)
  292.     NEW data.rp
  293.     InitRastPort(data.rp)
  294.  
  295.     data.projectid:=lastid++
  296.     data.failure:=$000
  297.     data.rstr:=String(256)
  298.     data.gstr:=String(256)
  299.     data.bstr:=String(256)
  300.     StrCopy(data.rstr,'x')
  301.     StrCopy(data.gstr,'y')
  302.     StrCopy(data.bstr,'(x+y)/2')
  303.     data.outputr:=OUT_Integer
  304.     data.outputg:=OUT_Integer
  305.     data.outputb:=OUT_Integer
  306.     NEW data.rfunc.create(data.outputr,data.rstr)
  307.     NEW data.gfunc.create(data.outputg,data.gstr)
  308.     NEW data.bfunc.create(data.outputb,data.bstr)
  309.     data.imagefile:=String(256)
  310.  
  311.     idecode(data.rfunc,data.rstr,$100,data) -> Is this necessary?
  312.     idecode(data.gfunc,data.gstr,$10,data)
  313.     idecode(data.bfunc,data.bstr,$1,data)
  314.     data.height:=256
  315.     StrCopy(data.imagefile,cat.msg_Unnamed.getstr())
  316.     data.loadm:=MUIV_PlaneFunc_LoadM_CutTile
  317.     data.lock:=0
  318.     data.name:=String(32)
  319.     StrCopy(data.name,cat.msg_Unnamed.getstr())
  320.     data.paused:=FALSE
  321.     data.type:=MUIV_PlaneFunc_Type_Graph
  322.     data.width:=256
  323.  
  324.     data.xmin:=10
  325.     data.xmax:=240
  326.     data.ymin:=30
  327.     data.ymax:=80
  328.  
  329.     IF cybergfxbase
  330.         data.rp.bitmap:= AllocBitMap(data.width,data.height,24,BMF_MINPLANES OR BMF_CLEAR,NIL)
  331.     ELSE
  332.         data.rp.bitmap:= Pi96AllocBitMap(data.width,data.height,24,BMF_MINPLANES OR BMF_CLEAR,NIL,RGBFB_A8R8G8B8)
  333.     ENDIF
  334.     IF (data.rp.bitmap)
  335.         RETURN obj -> If everything got ok
  336.     ENDIF
  337.     coerceMethodA(cl,obj,OM_DISPOSE) -> In case of failure
  338. ENDPROC
  339. PROC planeFunc_askminmax(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO muip_askminmax)
  340. DEF minmax:PTR TO mui_minmax,data:PTR TO planeFunc_data
  341.     data:=INST_DATA(cl,obj)
  342.     doSuperMethodA(cl,obj,msg)
  343.     minmax:=msg.minmaxinfo
  344.     minmax.maxwidth:=minmax.maxwidth+data.width
  345.     minmax.maxheight:=minmax.maxheight+data.height
  346.     minmax.defwidth:=minmax.defwidth+(data.width)
  347.     minmax.defheight:=minmax.defheight+(data.height)
  348. ENDPROC 0
  349.  
  350. PROC planeFunc_setup(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO msg)
  351.     IF doSuperMethodA(cl,obj,msg)=NIL THEN RETURN FALSE
  352.     Mui_RequestIDCMP(obj,IDCMP_MOUSEBUTTONS)
  353.     ->Mui_RequestIDCMP(obj,IDCMP_RAWKEY)
  354. ENDPROC MUI_TRUE
  355.  
  356. PROC planeFunc_cleanup(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO msg)
  357.     Mui_RejectIDCMP(obj,IDCMP_MOUSEBUTTONS)
  358.     ->Mui_RejectIDCMP(obj,IDCMP_RAWKEY)
  359. ENDPROC doSuperMethodA(cl,obj,msg)
  360.  
  361. PROC planeFunc_handleinput(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO muip_handleinput)
  362. #define _between(a,x,b) (((x)>=(a)) AND ((x)<=(b)))
  363. DEF data:PTR TO planeFunc_data,col,colourstr[30]:STRING,x,y
  364.  
  365.     data:=INST_DATA(cl,obj)
  366.     IF msg.imsg
  367.         IF (msg.imsg.class=IDCMP_MOUSEBUTTONS) AND (msg.imsg.code=SELECTDOWN)
  368.             IF (_between(_mleft(obj),msg.imsg.mousex,_mright(obj)) AND _between(_mtop(obj),msg.imsg.mousey,_bottom(obj)))
  369.                 x:=msg.imsg.mousex-_mleft(obj)+data.left
  370.                 y:=msg.imsg.mousey-_mtop(obj)+data.top
  371.                 /*get colour*/
  372.                 ObtainSemaphore(data.sema)
  373.                 IF cybergfxbase
  374.                     e_mod(x,data.width)
  375.                     col:=ReadRGBPixel(data.rp,e_mod(x,data.width),e_mod(y,data.height))
  376.                 ELSE
  377.                     col:=Pi96ReadPixel(data.rp,e_mod(x,data.width),e_mod(y,data.height))
  378.                 ENDIF
  379.                 ReleaseSemaphore(data.sema)
  380.                 StringF(colourstr,'c(\d,\d,\d)=[\d,\d,\d]',data.projectid,x,y,Shr(col,16),Shr(col AND $FF00,8),col AND $FF)
  381.                 set(colour_txt,MUIA_Text_Contents,colourstr)
  382.             ENDIF
  383. /*        ELSEIF (msg.imsg.class=IDCMP_RAWKEY)
  384.             IF (msg.imsg.code=96) OR (msg.imsg.code=97)
  385.                 data.shift:=TRUE
  386.             ELSEIF (msg.imsg.code=224) OR (msg.imsg.code=225)
  387.                 data.shift:=FALSE
  388.             ENDIF*/
  389.         ENDIF
  390.     ENDIF
  391. ENDPROC doSuperMethodA(cl,obj,msg)
  392.  
  393. PROC planeFunc_clear(cl:PTR TO iclass,obj:PTR TO object/*,msg:PTR TO msg*/)
  394. DEF data:PTR TO planeFunc_data
  395.     data:=INST_DATA(cl,obj)
  396.     ObtainSemaphore(data.sema)
  397.     IF data.lock=0
  398.         SetRast(data.rp,1)
  399.         ReleaseSemaphore(data.sema)
  400.         Mui_Redraw(obj,MADF_DRAWOBJECT)
  401.     ELSE
  402.         ReleaseSemaphore(data.sema)
  403.         message(data.projectid,cat.msgm_WriteVsLock.getstr())
  404.     ENDIF
  405. ENDPROC
  406.  
  407. PROC planeFunc_close(cl:PTR TO iclass,obj:PTR TO object/*,msg:PTR TO msg*/)
  408. DEF data:PTR TO planeFunc_data,kdata:PTR TO projectList_data
  409. DEF state,node:PTR TO project_Node,count=0,exec_list:PTR TO lh
  410.     data:=INST_DATA(cl,obj)
  411.     IF wclose=0
  412.         IF data.projectid=currid
  413.             nnset(showme_cyc,MUIA_Cycle_Active,0) -> update cycle display.
  414.         ENDIF
  415.         set(data.projectnode.window,MUIA_Window_Open,FALSE)
  416.     ELSEIF wclose=1
  417. quiet:=TRUE
  418. IF currid=data.projectid THEN currid:=-1
  419.         kdata:=INST_DATA(cl_projectlist.mcc_class,opened_lst)
  420.         doMethodA(obj,[MUIM_PlaneFunc_Abort,MUIV_PlaneFunc_Abort_Abort])
  421.         get(obj,MUIA_PlaneFunc_State,{state})
  422.         IF state = MUIV_PlaneFunc_State_Frozen
  423.             message(data.projectid,cat.msgm_RemVsFreeze.getstr())
  424.             quiet:=FALSE
  425.             RETURN
  426.         ENDIF
  427.  
  428.         exec_list:=kdata.exec_list
  429.         node:=exec_list.head
  430.         WHILE node.pid <> data.projectid
  431.             count++
  432.             node:=node.ln.succ
  433.         ENDWHILE
  434.         get(obj,MUIA_PlaneFunc_ProjectNode,{state})
  435.         doMethodA(opened_lst,[MUIM_List_Remove,count])
  436.         DisposeLink(node.item)
  437.         set(node.window,MUIA_Window_Open,FALSE)
  438.         doMethodA(app,[OM_REMMEMBER,node.window])
  439.         Mui_DisposeObject(node.window)
  440.         Remove(node)
  441.         END node
  442. quiet:=FALSE
  443.         doMethodA(opened_lst,[MUIM_ProjectList_Refresh,0])
  444.     ENDIF
  445. ENDPROC
  446.  
  447. PROC planeFunc_dispose(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO msg)
  448. DEF data:PTR TO planeFunc_data
  449.     data:=INST_DATA(cl,obj)
  450.     ObtainSemaphore(data.sema)
  451.     data.app:=NIL
  452.     ReleaseSemaphore(data.sema)
  453.     IF data.subtask
  454.         killsubtask(data.subtask)
  455.         IF data.type = MUIV_PlaneFunc_Type_Graph
  456.             free(data.rfunc)
  457.             free(data.gfunc)
  458.             free(data.bfunc)
  459.         ENDIF
  460.     ENDIF
  461.     IF cybergfxbase
  462.         IF (data.rp.bitmap) THEN FreeBitMap(data.rp.bitmap)
  463.     ELSE
  464.         IF (data.rp.bitmap) THEN Pi96FreeBitMap(data.rp.bitmap)
  465.     ENDIF
  466.     END data.rp
  467.     DisposeLink(data.name)
  468.     DisposeLink(data.rstr)
  469.     DisposeLink(data.gstr)
  470.     DisposeLink(data.bstr)
  471.     END data.rfunc
  472.     END data.gfunc
  473.     END data.bfunc
  474.     DisposeLink(data.imagefile)
  475. ENDPROC doSuperMethodA(cl,obj,msg)
  476. PROC planeFunc_lamps(cl:PTR TO iclass,obj:PTR TO object/*,msg:PTR TO msg*/)
  477. DEF data:PTR TO planeFunc_data
  478.     data:=INST_DATA(cl,obj)
  479.     IF data.failure AND $1
  480.         set(blue_fail,MUIA_Lamp_Color,MUIV_Lamp_Color_Error)
  481.     ELSE
  482.         set(blue_fail,MUIA_Lamp_Color,MUIV_Lamp_Color_Ok)
  483.     ENDIF
  484.     data:=INST_DATA(cl,obj)
  485.     IF data.failure AND $10
  486.         set(green_fail,MUIA_Lamp_Color,MUIV_Lamp_Color_Error)
  487.     ELSE
  488.         set(green_fail,MUIA_Lamp_Color,MUIV_Lamp_Color_Ok)
  489.     ENDIF
  490.     IF data.failure AND $100
  491.         set(red_fail,MUIA_Lamp_Color,MUIV_Lamp_Color_Error)
  492.     ELSE
  493.         set(red_fail,MUIA_Lamp_Color,MUIV_Lamp_Color_Ok)
  494.     ENDIF
  495. ENDPROC
  496.  
  497. PROC planeFunc_draw(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO muip_draw)
  498. DEF data:PTR TO planeFunc_data,utop,delta
  499. /*
  500. MovePixelArray(srcx,srcy,rp,dstx,dsty,wid,hei) -> (wid×hei) is the size of the rectangle to be moved!
  501. ScrollRaster(rp,dltx,dlty,xmin,ymin,xmax,ymax) -> (rectangle) is the rectangle where scroll will occur!
  502. */
  503.     doSuperMethodA(cl,obj,msg)
  504.     IF nodraw THEN RETURN
  505.     data:=INST_DATA(cl,obj)
  506.     IF (msg.flags AND MADF_DRAWUPDATE)
  507.         IF data.newtop <> 0/*scroll vertically*/
  508.             ObtainSemaphore(data.sema)
  509.             IF data.newtop < data.top  /*1)scroll upwards*/
  510.                 delta:=data.top-data.newtop
  511.                 IF delta < _mheight(obj)
  512.                     IF pi96base
  513.                         ScrollRaster(_rp(obj),0,-delta,_mleft(obj),_mtop(obj),_mleft(obj)+_mwidth(obj),_mtop(obj)+_mheight(obj))
  514.                     ELSE
  515.                         MovePixelArray(_mleft(obj),_mtop(obj),_rp(obj),_mleft(obj),_mtop(obj)+delta,_mwidth(obj),_mheight(obj)-delta)
  516.                     ENDIF
  517.                 ELSE
  518.                     delta:=_mheight(obj)
  519.                 ENDIF
  520.                 BltBitMapRastPort(data.rp.bitmap,data.left,data.newtop,_rp(obj),_mleft(obj),_mtop(obj),_mwidth(obj),delta,$c0)
  521.             ELSE        /*2)data.newtop > data.top => scroll downwards*/
  522.                 delta:=data.newtop-data.top
  523.                 IF delta < _mheight(obj)
  524.                     IF pi96base
  525.                         ScrollRaster(_rp(obj),0,delta,_mleft(obj),_mtop(obj),_mleft(obj)+_mwidth(obj),_mtop(obj)+_mheight(obj))
  526.                     ELSE
  527.                         MovePixelArray(_mleft(obj),_mtop(obj)+delta,_rp(obj),_mleft(obj),_mtop(obj),_mwidth(obj),_mheight(obj)-delta)
  528.                     ENDIF
  529.                 ELSE
  530.                     delta:=_mheight(obj)
  531.                 ENDIF
  532.                 BltBitMapRastPort(data.rp.bitmap,data.left,data.top+_mheight(obj),_rp(obj),_mleft(obj),_mbottom(obj)-delta+1,_mwidth(obj),delta,$c0)
  533.             ENDIF
  534.             ReleaseSemaphore(data.sema)
  535.             data.top:=data.newtop
  536.             data.newtop:=0
  537.         ENDIF
  538.         IF data.newleft <> 0/*scroll horizontally*/
  539.             ObtainSemaphore(data.sema)
  540.             IF data.newleft < data.left  /*3)scroll leftwards*/
  541.                 delta:=data.left-data.newleft
  542.                 IF delta < _mwidth(obj)
  543.                     IF pi96base
  544.                         ScrollRaster(_rp(obj),-delta,0,_mleft(obj),_mtop(obj),_mleft(obj)+_mwidth(obj),_mtop(obj)+_mheight(obj))
  545.                     ELSE
  546.                         MovePixelArray(_mleft(obj),_mtop(obj),_rp(obj),_mleft(obj)+delta,_mtop(obj),_mwidth(obj)-delta,_mheight(obj))
  547.                     ENDIF
  548.                 ELSE
  549.                     delta:=_mwidth(obj)
  550.                 ENDIF
  551.                 BltBitMapRastPort(data.rp.bitmap,data.newleft,data.top,_rp(obj),_mleft(obj),_mtop(obj),delta,_mheight(obj),$c0)
  552.             ELSE        /*4)data.newleft > data.left => scroll rightwards*/
  553.                 delta:=data.newleft-data.left
  554.                 IF delta < _mwidth(obj)
  555.                     IF pi96base
  556.                         ScrollRaster(_rp(obj),delta,0,_mleft(obj),_mtop(obj),_mleft(obj)+_mwidth(obj),_mtop(obj)+_mheight(obj))
  557.                     ELSE
  558.                         MovePixelArray(_mleft(obj)+delta,_mtop(obj),_rp(obj),_mleft(obj),_mtop(obj),_mwidth(obj)-delta,_mheight(obj))
  559.                     ENDIF
  560.                 ELSE
  561.                     delta :=_mwidth(obj)
  562.                 ENDIF
  563.                 BltBitMapRastPort(data.rp.bitmap,data.left+_mwidth(obj),data.top,_rp(obj),_mright(obj)-delta+1,_mtop(obj),delta,_mheight(obj),$c0)
  564.             ENDIF
  565.             ReleaseSemaphore(data.sema)
  566.             data.left:=data.newleft
  567.             data.newleft:=0
  568.         ENDIF
  569.         IF data.drawn < data.calculated
  570.             utop:=data.drawn+1  /*5) Update display*/
  571.             delta:=data.calculated-data.drawn            /*I don't think that the semaphore is required here, only the lines that are already been*/
  572.             IF delta > 0                                /*calculated will be drawn and data.calculated is accessed only once.*/
  573.                 IF (utop < (data.top+_mheight(obj))) AND (utop+delta > data.top)
  574.                     IF utop < data.top
  575.                         delta:=delta-data.top+utop
  576.                         utop:=data.top
  577.                     ELSEIF (utop+delta) > (data.top+_mheight(obj))
  578.                         delta:=data.top+_mheight(obj)-utop
  579.                     ENDIF
  580.                     BltBitMapRastPort(data.rp.bitmap,data.left,utop,_rp(obj),_mleft(obj),_mtop(obj)+utop-data.top,_mwidth(obj),delta,$c0)
  581.                 ENDIF
  582.             ENDIF
  583.             data.drawn:=data.calculated
  584.         ENDIF
  585.     ELSEIF (msg.flags AND MADF_DRAWOBJECT)
  586.         /*the window may have been resized..*/
  587.         ObtainSemaphore(data.sema)
  588.         set(data.hscroll,MUIA_Prop_Visible,_mwidth(obj))
  589.         set(data.vscroll,MUIA_Prop_Visible,_mheight(obj))
  590.         get(data.vscroll,MUIA_Prop_First,{delta})
  591.         data.top:=delta
  592.         get(data.hscroll,MUIA_Prop_First,{delta})
  593.         data.left:=delta
  594.         BltBitMapRastPort(data.rp.bitmap,data.left,data.top,_rp(obj),_mleft(obj),_mtop(obj),_mwidth(obj),_mheight(obj),$c0)
  595.         data.drawn:=data.calculated
  596.         ReleaseSemaphore(data.sema)
  597.  
  598.         /*SetAPen(_rp(obj),_dri(obj).pens[TEXTPEN])
  599.         data.xmin:=data.xmin-1
  600.         data.xmax:=data.xmax+2
  601.         data.ymin:=data.ymin-1
  602.         data.ymax:=data.ymax+2
  603.         IF data.ymin > data.top              /*top border*/
  604.             Move(_rp(obj),_mleft(obj)+Max(0,data.xmin-data.left),         _mtop(obj)+data.ymin-data.top)
  605.             Draw(_rp(obj),_mleft(obj)+Min(_mwidth(obj),data.xmax-data.left),_mtop(obj)+data.ymin-data.top)
  606.         ENDIF
  607.         IF data.xmax < data.left+_mwidth(obj)/*right border*/
  608.             Move(_rp(obj),_mleft(obj)+data.xmax-data.left,                _mtop(obj)+Max(0,data.ymin-data.top))
  609.             Draw(_rp(obj),_mleft(obj)+data.xmax-data.left,                _mtop(obj)+Min(_mheight(obj),data.ymax-data.top))
  610.         ENDIF
  611.         IF data.ymax < data.top+_mheight(obj)/*bottom border*/
  612.             Move(_rp(obj),_mleft(obj)+Min(_mwidth(obj),data.xmax-data.left),_mtop(obj)+data.ymax-data.top)
  613.             Draw(_rp(obj),_mleft(obj)+Max(0,data.xmin-data.left),         _mtop(obj)+data.ymax-data.top)
  614.         ENDIF
  615.         IF data.xmin > data.left             /*left border*/
  616.             Move(_rp(obj),_mleft(obj)+data.xmin-data.left,                _mtop(obj)+Min(_mheight(obj),data.ymax-data.top))
  617.             Draw(_rp(obj),_mleft(obj)+data.xmin-data.left,                _mtop(obj)+Max(0,data.ymin-data.top))
  618.         ENDIF
  619.  
  620.         SetAPen(_rp(obj),_dri(obj).pens[SHINEPEN])
  621.         data.xmin:=data.xmin-1
  622.         data.xmax:=data.xmax-1
  623.         data.ymin:=data.ymin-1
  624.         data.ymax:=data.ymax-1
  625.         IF data.ymin > data.top              /*top border*/
  626.             Move(_rp(obj),_mleft(obj)+Max(0,data.xmin-data.left),         _mtop(obj)+data.ymin-data.top)
  627.             Draw(_rp(obj),_mleft(obj)+Min(_mwidth(obj),data.xmax-data.left),_mtop(obj)+data.ymin-data.top)
  628.         ENDIF
  629.         IF data.xmax < data.left+_mwidth(obj)/*right border*/
  630.             Move(_rp(obj),_mleft(obj)+data.xmax-data.left,                _mtop(obj)+Max(0,data.ymin-data.top))
  631.             Draw(_rp(obj),_mleft(obj)+data.xmax-data.left,                _mtop(obj)+Min(_mheight(obj),data.ymax-data.top))
  632.         ENDIF
  633.         IF data.ymax < data.top+_mheight(obj)/*bottom border*/
  634.             Move(_rp(obj),_mleft(obj)+Min(_mwidth(obj),data.xmax-data.left),_mtop(obj)+data.ymax-data.top)
  635.             Draw(_rp(obj),_mleft(obj)+Max(0,data.xmin-data.left),         _mtop(obj)+data.ymax-data.top)
  636.         ENDIF
  637.         IF data.xmin > data.left            /*left border*/
  638.             Move(_rp(obj),_mleft(obj)+data.xmin-data.left,                _mtop(obj)+Min(_mheight(obj),data.ymax-data.top))
  639.             Draw(_rp(obj),_mleft(obj)+data.xmin-data.left,                _mtop(obj)+Max(0,data.ymin-data.top))
  640.         ENDIF
  641.         data.xmin:=data.xmin+2
  642.         data.xmax:=data.xmax-1
  643.         data.ymin:=data.ymin+2
  644.         data.ymax:=data.ymax-1  */
  645.     ENDIF
  646. ENDPROC
  647.  
  648. /*not yet finished: ability to select a destination area*/
  649.  
  650. /*PROC drawhoriz(x,y,xx,obj:PTR TO object,data:PTR TO planeFunc_data)
  651.     IF data.ymin > data.top              /*top border*/
  652.         Move(_rp(obj),_mleft(obj)+Max(0,data.xmin-data.left),         _mtop(obj)+data.ymin-data.top)
  653.         Draw(_rp(obj),_mleft(obj)+Min(_mwidth(obj),data.xmax-data.left),_mtop(obj)+data.ymin-data.top)
  654.     ENDIF
  655.  
  656.     Move(_rp(obj),x,y)
  657.     Draw(_rp(obj),xx,y)
  658. ENDPROC*/
  659.  
  660. PROC planeFunc_get(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO opget)
  661. DEF data:PTR TO planeFunc_data,storage,attrid
  662.  
  663.     data:=INST_DATA(cl,obj)
  664.     attrid:=msg.attrid
  665.     storage:=msg.storage
  666.     ObtainSemaphore(data.sema)
  667.     SELECT attrid
  668.     CASE MUIA_PlaneFunc_Bstr
  669.         ^storage:=data.bstr
  670.     CASE MUIA_PlaneFunc_Gstr
  671.         ^storage:=data.gstr
  672.     CASE MUIA_PlaneFunc_Height
  673.         ^storage:=data.height
  674.     CASE MUIA_PlaneFunc_ImageFile
  675.         ^storage:=data.imagefile
  676.     CASE MUIA_PlaneFunc_Loading
  677.         ^storage:=data.loading
  678.     CASE MUIA_PlaneFunc_LoadM
  679.         ^storage:=data.loadm
  680.     CASE MUIA_PlaneFunc_Lock
  681.         ^storage:=data.lock
  682.     CASE MUIA_PlaneFunc_Name
  683.         ^storage:=data.name
  684.     CASE MUIA_PlaneFunc_Percent
  685.         IF data.lock=MUIV_PlaneFunc_Lock_Write
  686.             ^storage:=data.calculated*100/data.height
  687.         ELSE
  688.             ^storage:=0
  689.         ENDIF
  690.     CASE MUIA_PlaneFunc_OutputR
  691.         ^storage:=data.outputr
  692.     CASE MUIA_PlaneFunc_OutputG
  693.         ^storage:=data.outputg
  694.     CASE MUIA_PlaneFunc_OutputB
  695.         ^storage:=data.outputb
  696.     CASE MUIA_PlaneFunc_ProjectID
  697.         ^storage:=data.projectid
  698.     CASE MUIA_PlaneFunc_ProjectNode
  699.         ^storage:=data.projectnode
  700.     CASE MUIA_PlaneFunc_Quiet
  701.         ^storage:=data.quiet
  702.     CASE MUIA_PlaneFunc_Rstr
  703.         ^storage:=data.rstr
  704.     CASE MUIA_PlaneFunc_State
  705.         IF data.lock = MUIV_PlaneFunc_Lock_Write
  706.             IF data.paused
  707.                 ^storage:=MUIV_PlaneFunc_State_Paused
  708.             ELSEIF data.loading
  709.                 ^storage:=MUIV_PlaneFunc_State_Loading
  710.             ELSE
  711.                 ^storage:=MUIV_PlaneFunc_State_Drawing
  712.             ENDIF
  713.         ELSE
  714.             IF data.lock = 0
  715.                 ^storage:=MUIV_PlaneFunc_State_Idle
  716.             ELSE
  717.                 ^storage:=MUIV_PlaneFunc_State_Frozen
  718.             ENDIF
  719.         ENDIF
  720.     CASE MUIA_PlaneFunc_Type
  721.         ^storage:=data.type
  722.     CASE MUIA_PlaneFunc_Width
  723.         ^storage:=data.width
  724.     DEFAULT
  725.         ReleaseSemaphore(data.sema)
  726.         RETURN doSuperMethodA(cl,obj,msg)
  727.     ENDSELECT
  728.     ReleaseSemaphore(data.sema)
  729. ENDPROC MUI_TRUE
  730.  
  731. PROC planeFunc_set(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO opset)
  732. DEF data:PTR TO planeFunc_data,
  733.     tags:PTR TO tagitem,
  734.     tag:PTR TO tagitem,
  735.     attrid
  736. DEF window,group
  737.  
  738.     data:=INST_DATA(cl,obj)
  739.     tags:=msg.attrlist
  740.     ObtainSemaphore(data.sema)
  741.     WHILE tag:=NextTagItem({tags})
  742.         attrid:=tag.tag
  743.         SELECT attrid
  744.         CASE MUIA_PlaneFunc_ImageFile
  745.             StrCopy(data.imagefile,tag.data)
  746.         CASE MUIA_PlaneFunc_Loading
  747.             data.loading:=tag.data
  748.             IF data.projectid=currid THEN
  749.                 setlamp(obj)
  750.         CASE MUIA_PlaneFunc_Left
  751.             data.newleft:=tag.data
  752.             Mui_Redraw(obj,MADF_DRAWUPDATE)
  753.         CASE MUIA_PlaneFunc_ProjectNode
  754.             data.projectnode:=tag.data
  755.         CASE MUIA_PlaneFunc_Top
  756.             data.newtop:=tag.data
  757.             Mui_Redraw(obj,MADF_DRAWUPDATE)
  758.         CASE MUIA_PlaneFunc_Lock
  759.             IF data.lock=MUIV_PlaneFunc_Lock_Write-> If the object is being written, the only tag allowed is NoWrite
  760.                 IF tag.data=MUIV_PlaneFunc_Lock_NoWrite
  761.                     data.lock:=0
  762.                 ENDIF
  763.             ELSEIF data.lock=0            -> If the object is free, it can either be read or write - locked
  764.                 data.lock:=tag.data
  765.             ELSE                         -> If the object is read locked, it can be read unlocked or read locked again.
  766.                 IF tag.data=MUIV_PlaneFunc_Lock_NoRead
  767.                     data.lock:=data.lock-1
  768.                 ELSEIF tag.data=MUIV_PlaneFunc_Lock_Read
  769.                     data.lock:=data.lock+1
  770.                 ENDIF
  771.             ENDIF
  772.             doMethodA(opened_lst,[MUIM_ProjectList_Refresh,data.projectid+2]) -> Refresh the "state" lamp.
  773.         CASE MUIA_PlaneFunc_Name
  774.             StrCopy(data.name,tag.data)
  775.             get(obj,MUIA_WindowObject,{window})
  776.             set(window,MUIA_Window_Title,data.name)
  777.         CASE MUIA_PlaneFunc_Quiet
  778.             data.quiet:=tag.data
  779.             IF data.quiet=FALSE
  780.                 get(obj,MUIA_Parent,{group})
  781.                 doMethodA(group,[MUIM_Group_InitChange])
  782.                 doMethodA(group,[MUIM_Group_ExitChange])
  783.                 IF cybergfxbase
  784.                     IF (data.rp.bitmap) THEN FreeBitMap(data.rp.bitmap)
  785.                     data.rp.bitmap:= AllocBitMap(data.width,data.height,24,BMF_MINPLANES OR BMF_CLEAR,friend)
  786.                 ELSE
  787.                     IF (data.rp.bitmap) THEN Pi96FreeBitMap(data.rp.bitmap)
  788.                     data.rp.bitmap:= Pi96AllocBitMap(data.width,data.height,24,BMF_MINPLANES OR BMF_CLEAR,NIL,RGBFB_A8R8G8B8)
  789.                 ENDIF
  790.                 IF data.projectid=currid
  791.                     nnset(width_str,MUIA_String_Integer,data.width)
  792.                     nnset(height_str,MUIA_String_Integer,data.height)
  793.                 ENDIF
  794.                 IF data.subtask THEN
  795.                     sendsubtaskmsg(data.subtask,STC_CHANGEDONE,NIL)
  796.             ENDIF
  797.         DEFAULT
  798.             IF (data.lock <> MUIV_PlaneFunc_Lock_Write) OR (data.quiet=-2)
  799.                 SELECT attrid
  800.                 CASE MUIA_PlaneFunc_Bstr
  801.                     StrCopy(data.bstr,tag.data)
  802.                     LowerStr(data.bstr)
  803.                     idecode(data.bfunc,tag.data,$1,data)
  804.                 CASE MUIA_PlaneFunc_Gstr
  805.                     StrCopy(data.gstr,tag.data)
  806.                     idecode(data.gfunc,tag.data,$10,data)
  807.                 CASE MUIA_PlaneFunc_LoadM
  808.                     data.loadm:=tag.data
  809.                 CASE MUIA_PlaneFunc_OutputR
  810.                     data.outputr:=tag.data
  811.                     IF tag.data <= OUT_Float64
  812.                         idecode(data.rfunc,data.rstr,$100,data,data.outputr)
  813.                     ENDIF
  814.                 CASE MUIA_PlaneFunc_OutputG
  815.                     data.outputg:=tag.data
  816.                     IF tag.data <= OUT_Float64
  817.                         idecode(data.gfunc,data.gstr,$10,data,data.outputg)
  818.                     ENDIF
  819.                 CASE MUIA_PlaneFunc_OutputB
  820.                     data.outputb:=tag.data
  821.                     IF tag.data <= OUT_Float64
  822.                         idecode(data.bfunc,data.bstr,$1,data,data.outputb)
  823.                     ENDIF
  824.                 CASE MUIA_PlaneFunc_Rstr
  825.                     StrCopy(data.rstr,tag.data)
  826.                     LowerStr(data.rstr)
  827.                     idecode(data.rfunc,tag.data,$100,data)
  828.                 CASE MUIA_PlaneFunc_Type
  829.                     data.type:=tag.data
  830.                 DEFAULT
  831.                     IF (data.lock <> MUIV_PlaneFunc_Lock_NoRead) AND (data.quiet<>-2)
  832.                         message(data.projectid,cat.msgm_AttrVsLock.getstr())
  833.                     ELSEIF attrid = MUIA_PlaneFunc_Width
  834.                         data.width:=tag.data
  835.                         set(data.hscroll,MUIA_Prop_Entries,tag.data)
  836.                         IF data.quiet=FALSE
  837.                             get(obj,MUIA_Parent,{group})
  838.                             doMethodA(group,[MUIM_Group_InitChange])
  839.                             doMethodA(group,[MUIM_Group_ExitChange])
  840.                             IF cybergfxbase
  841.                                 IF (data.rp.bitmap) THEN FreeBitMap(data.rp.bitmap)
  842.                                 data.rp.bitmap:= AllocBitMap(data.width,data.height,24,BMF_MINPLANES OR BMF_CLEAR,friend)
  843.                             ELSE
  844.                                 IF (data.rp.bitmap) THEN Pi96FreeBitMap(data.rp.bitmap)
  845.                                 data.rp.bitmap:= Pi96AllocBitMap(data.width,data.height,24,BMF_MINPLANES OR BMF_CLEAR,NIL,RGBFB_A8R8G8B8)
  846.                             ENDIF
  847.                         ENDIF
  848.                     ELSEIF attrid = MUIA_PlaneFunc_Height
  849.                         data.height:=tag.data
  850.                         set(data.vscroll,MUIA_Prop_Entries,tag.data)
  851.                         IF data.quiet=FALSE
  852.                             get(obj,MUIA_Parent,{group})
  853.                             doMethodA(group,[MUIM_Group_InitChange])
  854.                             doMethodA(group,[MUIM_Group_ExitChange])
  855.                             IF cybergfxbase
  856.                             IF (data.rp.bitmap) THEN FreeBitMap(data.rp.bitmap)
  857.                                 data.rp.bitmap:= AllocBitMap(data.width,data.height,24,BMF_MINPLANES OR BMF_CLEAR,friend)
  858.                             ELSE
  859.                                 IF (data.rp.bitmap) THEN Pi96FreeBitMap(data.rp.bitmap)
  860.                                 data.rp.bitmap:= Pi96AllocBitMap(data.width,data.height,24,BMF_MINPLANES OR BMF_CLEAR,NIL,RGBFB_A8R8G8B8)
  861.                             ENDIF
  862.                         ENDIF
  863.                     ENDIF
  864.                 ENDSELECT
  865.             ELSE
  866.                 message(data.projectid,cat.msgm_AttrVsLock.getstr())
  867.             ENDIF
  868.         ENDSELECT
  869.     ENDWHILE
  870.     ReleaseSemaphore(data.sema)
  871. ENDPROC doSuperMethodA(cl,obj,msg)
  872.  
  873. /*idecode, extends f.create(). Ok, I know I should maybe have written a method, but it's easier like this :-¦*/
  874. PROC idecode(f:PTR TO expression,s:PTR TO CHAR,l,data:PTR TO planeFunc_data,in=-1)
  875. DEF out/*:PTR TO outinfo,err*/,i:PTR TO CHAR
  876.  
  877.     i:=String(StrLen(s)) -> New string so that lowerstr doesn't change text in field.
  878.     StrCopy(i,s)
  879.     LowerStr(i)
  880.  
  881.     IF in = -1 THEN
  882.         in:=f.precision
  883.  
  884.     IF in = OUT_Float64
  885.         message(data.projectid,cat.msgm_Nof64.getstr())
  886.         DisposeLink(i)
  887.         RETURN
  888.     ENDIF
  889.  
  890.     END f
  891.  
  892.     NEW f.create(in,i)
  893.     out:=f.message
  894.     IF out AND FAILURE
  895.         data.failure:=data.failure OR l
  896.         /*err:=out.error
  897.         SELECT err
  898.         CASE ERR_NoParse
  899.             messagefmt(data.projectid,cat.msgm_NoParse.getstr(),out.quote)
  900.         CASE ERR_NoFunc
  901.             messagefmt(data.projectid,cat.msgm_NoFunc.getstr(),out.quote)
  902.         CASE ERR_NoChar
  903.             messagefmt(data.projectid,cat.msgm_NoChar.getstr(),out.quote)
  904.         DEFAULT
  905.             message(data.projectid,cat.msgm_Failure.getstr())
  906.         ENDSELECT
  907.         END out*/
  908.     ELSE -> Can't currently have both failure and warning. It will come :-)
  909.         data.failure:=data.failure AND Not(l)
  910.         IF out AND WARN_NoSupport THEN
  911.             message(data.projectid,cat.msgm_WarnNoSupport.getstr())
  912.         IF out AND WARN_EPi THEN
  913.             message(data.projectid,cat.msgm_WarnEPi.getstr())
  914.     ENDIF
  915.     doMethodA(data.self,[MUIM_PlaneFunc_Lamps])
  916.     DisposeLink(i)
  917. ENDPROC
  918.  
  919. PROC planeFunc_abort(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO args_abort)
  920. DEF data:PTR TO planeFunc_data,ds1:PTR TO datestamp,ds2:datestamp,qe[30]:STRING,u
  921.     data:=INST_DATA(cl,obj)
  922.     IF data.subtask
  923.         killsubtask(data.subtask)
  924.         data.subtask:=NIL
  925.         set(obj,MUIA_PlaneFunc_Lock,MUIV_PlaneFunc_Lock_NoWrite)
  926.         IF data.type = MUIV_PlaneFunc_Type_Graph
  927.             free(data.rfunc)
  928.             free(data.gfunc)
  929.             free(data.bfunc)
  930.         ENDIF
  931.         u:=msg.reason
  932.         SELECT u
  933.         CASE MUIV_PlaneFunc_Abort_Finish
  934.             ds1:=data.ds
  935.             DateStamp(ds2)
  936.             u:=(ds2.minute-ds1.minute)*TICKS_PER_MINUTE+ds2.tick-ds1.tick -> number of ticks
  937.             StringF(qe,'\s  \z\d[2]:\z\d[2].\z\d[2].',cat.msgm_Done.getstr(),u/TICKS_PER_MINUTE,Mod(u,TICKS_PER_MINUTE)/TICKS_PER_SECOND,Mod(u,TICKS_PER_SECOND)*100/TICKS_PER_SECOND)
  938.             message(data.projectid,qe)
  939.         CASE MUIV_PlaneFunc_Abort_Abort
  940.             message(data.projectid,cat.msgm_Abort.getstr())
  941.         CASE MUIV_PlaneFunc_Abort_NoLoad
  942.             message(data.projectid,cat.msgm_NoLoad.getstr())
  943.         ENDSELECT
  944.  
  945.         data.drawn:=0
  946.         data.calculated:=0
  947.         data.paused:=FALSE
  948.     ENDIF
  949. ENDPROC
  950.  
  951. PROC planeFunc_loadfunc(cl:PTR TO iclass,obj:PTR TO object/*,msg:PTR TO msg*/)
  952. DEF u,filereq:PTR TO filerequester,s[200]:STRING,handler,data:PTR TO planeFunc_data,
  953.     eq,var[10]:STRING,value:PTR TO CHAR
  954.  
  955.     data:=INST_DATA(cl,obj)
  956.     get(settings_win,MUIA_Window_Window,{u})
  957.     filereq:=AllocAslRequest(ASL_FILEREQUEST,
  958.                             [ASL_HAIL,      cat.msgr_Loadf_T.getstr(),
  959.                              ASL_OKTEXT,    cat.msgr_Loadf_Ok.getstr(),
  960.                              ASL_DIR,       'progdir:Functions/',
  961.                              ASL_WINDOW,    u,
  962.                              NIL])
  963.     IF filereq=NIL
  964.         Mui_RequestA(app,settings_win,0,cat.msgr_Loadf_T.getstr(),NIL,cat.msgr_NoAslReq.getstr(),NIL)
  965.     ELSE
  966.         IF AslRequest(filereq,NIL)
  967.             StrCopy(s,filereq.drawer)
  968.             AddPart(s,filereq.file,StrMax(s))
  969.             SetStr(s,StrLen(s))
  970.         ENDIF
  971.         FreeAslRequest(filereq)
  972.     ENDIF
  973.     IF s[] = NIL THEN RETURN
  974.     handler:=Open(s,OLDFILE)
  975.     Fgets(handler,s,StrMax(s)-1)
  976.     IF s[]=NIL
  977.         Close(handler)
  978.         message(data.projectid,cat.msgm_EmptyFile.getstr())
  979.         RETURN
  980.     ENDIF
  981.     SetStr(s,StrLen(s)-1)
  982.     IF Not(StrCmp(s,'picFX function-file; type1'))
  983.         Close(handler)
  984.         message(data.projectid,cat.msgm_BadFile.getstr())
  985.         RETURN
  986.     ENDIF
  987.     set(obj,MUIA_PlaneFunc_Quiet,MUI_TRUE)
  988.     WHILE Fgets(handler,s,StrMax(s)-1)/* semaphore will be obtained in the SET method */
  989.         SetStr(s,StrLen(s)-1)
  990.         eq:=InStr(s,'=')
  991.         StrCopy(var,s,eq)
  992.         value:=s+eq+1
  993.         IF StrCmp(var,'bstr')
  994.             set(obj,MUIA_PlaneFunc_Bstr,value)
  995.         ELSEIF StrCmp(var,'gstr')
  996.             set(obj,MUIA_PlaneFunc_Gstr,value)
  997.         ELSEIF StrCmp(var,'height')
  998.             set(obj,MUIA_PlaneFunc_Height,Val(value))
  999.         ELSEIF StrCmp(var,'rstr')
  1000.             set(obj,MUIA_PlaneFunc_Rstr,value)
  1001.         ELSEIF StrCmp(var,'width')
  1002.             set(obj,MUIA_PlaneFunc_Width,Val(value))
  1003.         ELSEIF StrCmp(var,'precision') -> Obsolete tag!
  1004.             set(obj,MUIA_PlaneFunc_OutputR,Val(value))
  1005.             set(obj,MUIA_PlaneFunc_OutputG,Val(value))
  1006.             set(obj,MUIA_PlaneFunc_OutputB,Val(value))
  1007.             message(data.projectid,'Warning, obsolete tag "precision" used!')
  1008.         ELSEIF StrCmp(var,'outputr')
  1009.             set(obj,MUIA_PlaneFunc_OutputR,Val(value))
  1010.         ELSEIF StrCmp(var,'outputg')
  1011.             set(obj,MUIA_PlaneFunc_OutputG,Val(value))
  1012.         ELSEIF StrCmp(var,'outputb')
  1013.             set(obj,MUIA_PlaneFunc_OutputB,Val(value))
  1014.         ELSE
  1015.             StringF(s,cat.msgm_UnknownVar.getstr(),var)
  1016.             message(data.projectid,s)
  1017.         ENDIF
  1018.     ENDWHILE
  1019.     Close(handler)
  1020.     set(obj,MUIA_PlaneFunc_Quiet,FALSE)
  1021.     doMethodA(opened_lst,[MUIM_ProjectList_Refresh,0])
  1022. ENDPROC
  1023.  
  1024. PROC planeFunc_render(cl:PTR TO iclass,obj:PTR TO object/*,msg*/)
  1025. DEF data:PTR TO planeFunc_data,state
  1026.     data:=INST_DATA(cl,obj)
  1027.     get(obj,MUIA_PlaneFunc_State,{state})
  1028.     SELECT state
  1029.     CASE MUIV_PlaneFunc_State_Idle
  1030.         IF data.type = MUIV_PlaneFunc_Type_DTPic
  1031.             set(obj,MUIA_PlaneFunc_Loading,TRUE)
  1032.             set(obj,MUIA_PlaneFunc_Lock,MUIV_PlaneFunc_Lock_Write)
  1033.  
  1034.             data.rupd:=rupd
  1035.  
  1036.             /* the following call starts the sub task */
  1037.             data.subtask:= spawnsubtask('PicFX-Render-Task',{loadpicture},data)
  1038.             IF (data.subtask)
  1039.                 SetTaskPri(data.subtask.st_Task,cp)
  1040.                 sendsubtaskmsg(data.subtask,STC_START,NIL)
  1041.             ENDIF
  1042.         ELSE
  1043.             set(obj,MUIA_PlaneFunc_Lock,MUIV_PlaneFunc_Lock_Write)
  1044.             IF freeze(data.rfunc) = 0 -> This will freeze used projects; if zero, it failed.
  1045.                 message(data.projectid,cat.msgm_NoAlloc.getstr())
  1046.                 set(obj,MUIA_PlaneFunc_Lock,MUIV_PlaneFunc_Lock_NoWrite)
  1047.                 RETURN
  1048.             ENDIF
  1049.             IF freeze(data.gfunc) = 0
  1050.                 message(data.projectid,cat.msgm_NoAlloc.getstr())
  1051.                 set(obj,MUIA_PlaneFunc_Lock,MUIV_PlaneFunc_Lock_NoWrite)
  1052.                 RETURN
  1053.             ENDIF
  1054.             IF freeze(data.bfunc) = 0
  1055.                 message(data.projectid,cat.msgm_NoAlloc.getstr())
  1056.                 set(obj,MUIA_PlaneFunc_Lock,MUIV_PlaneFunc_Lock_NoWrite)
  1057.                 RETURN
  1058.             ENDIF
  1059.             /*will we have to save previous pixel information?*/
  1060.             data.savepixel:=(data.outputr>=OUT_OldR) AND (data.outputr<=OUT_OldB)
  1061.             data.savepixel:=data.savepixel OR ((data.outputg>=OUT_OldR) AND (data.outputg<=OUT_OldB))
  1062.             data.savepixel:=data.savepixel OR ((data.outputb>=OUT_OldR) AND (data.outputb<=OUT_OldB))
  1063.  
  1064.             data.rupd:=rupd
  1065.  
  1066.             data.subtask:= spawnsubtask('PicFX-Render-Task',{renderfunc},data)
  1067.             IF (data.subtask)
  1068.                 SetTaskPri(data.subtask.st_Task,cp)
  1069.                 sendsubtaskmsg(data.subtask,STC_START,NIL)
  1070.             ENDIF
  1071.         ENDIF
  1072.     CASE MUIV_PlaneFunc_State_Drawing
  1073.         sendsubtaskmsg(data.subtask,STC_PAUSE,NIL)
  1074.         data.paused:=TRUE
  1075.         doMethodA(opened_lst,[MUIM_ProjectList_Refresh,data.projectid+2])
  1076.     CASE MUIV_PlaneFunc_State_Paused
  1077.         data.paused:=FALSE
  1078.         sendsubtaskmsg(data.subtask,STC_RESTART,NIL)
  1079.         doMethodA(opened_lst,[MUIM_ProjectList_Refresh,data.projectid+2])
  1080.     CASE MUIV_PlaneFunc_State_Frozen
  1081.         message(data.projectid,cat.msgm_WriteVsFreeze.getstr())
  1082.     ENDSELECT
  1083. ENDPROC
  1084.  
  1085. PROC planeFunc_savefunc(cl:PTR TO iclass,obj:PTR TO object/*,msg:PTR TO msg*/)
  1086. DEF u,filereq:PTR TO filerequester,s[200]:STRING,newhandler,oldhandler,data:PTR TO planeFunc_data
  1087.     data:=INST_DATA(cl,obj)
  1088.     get(settings_win,MUIA_Window_Window,{u})
  1089.     filereq:=AllocAslRequest(ASL_FILEREQUEST,
  1090.                             [ASL_HAIL,      cat.msgr_Savef_T.getstr(),
  1091.                              ASL_OKTEXT,    cat.msgr_Savef_Ok.getstr(),
  1092.                              ASL_DIR,       'progdir:Functions/',
  1093.                              ASL_WINDOW,    u,
  1094.                              ASL_FUNCFLAGS, FILF_SAVE,
  1095.                              NIL])
  1096.     IF filereq=NIL
  1097.         Mui_RequestA(app,settings_win,0,cat.msgr_Savef_T.getstr(),NIL,cat.msgr_NoAslReq.getstr(),NIL)
  1098.     ELSE
  1099.         IF AslRequest(filereq,NIL)
  1100.             StrCopy(s,filereq.drawer)
  1101.             AddPart(s,filereq.file,StrMax(s))
  1102.             SetStr(s,StrLen(s))
  1103.         ENDIF
  1104.         FreeAslRequest(filereq)
  1105.     ENDIF
  1106.     IF s[] = NIL THEN RETURN
  1107.     newhandler:=Open(s,NEWFILE)
  1108.     oldhandler:=SetStdOut(newhandler)
  1109.     WriteF('picFX function-file; type1\n')
  1110.     ObtainSemaphore(data.sema)
  1111.     WriteF('bstr=\s\n',data.bstr)
  1112.     WriteF('gstr=\s\n',data.gstr)
  1113.     WriteF('height=\d\n',data.height)
  1114.     WriteF('rstr=\s\n',data.rstr)
  1115.     WriteF('outputr=\d\n',data.outputr)
  1116.     WriteF('outputg=\d\n',data.outputg)
  1117.     WriteF('outputb=\d\n',data.outputb)
  1118.     WriteF('width=\d\n',data.width)
  1119.     ReleaseSemaphore(data.sema)
  1120.     Close(newhandler)
  1121.     SetStdOut(oldhandler)
  1122. ENDPROC
  1123.  
  1124. PROC planeFunc_savepic(/*cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO args_file*/)
  1125. ENDPROC
  1126.  
  1127. PROC planeFunc_settaskpri(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO args_ctp)
  1128. DEF data:PTR TO planeFunc_data
  1129.     data:=INST_DATA(cl,obj)
  1130.     ObtainSemaphore(data.sema)
  1131.     IF data.subtask THEN
  1132.         SetTaskPri(data.subtask.st_Task,msg.value)
  1133.     ReleaseSemaphore(data.sema)
  1134. ENDPROC
  1135. PROC planeFunc_update(cl:PTR TO iclass,obj:PTR TO object/*,msg:PTR TO msg*/)
  1136. DEF data:PTR TO planeFunc_data
  1137.     data:=INST_DATA(cl,obj)
  1138.     ObtainSemaphore(data.sema)
  1139.     data.app:=NIL
  1140.     ReleaseSemaphore(data.sema)
  1141.     Mui_Redraw(obj,MADF_DRAWUPDATE)
  1142.     IF data.projectid = currid
  1143. ->        ObtainSemaphore(data.sema)
  1144.         set(state_gau,MUIA_Gauge_Current,data.calculated*100/data.height)
  1145. ->        ReleaseSemaphore(data.sema)
  1146.     ENDIF
  1147.     ObtainSemaphore(data.sema)
  1148.     data.app:=app
  1149.     ReleaseSemaphore(data.sema)
  1150. ENDPROC
  1151.  
  1152. /***************************************************************
  1153. ** custom ProjectList private subclass of List class          **
  1154. ****************************************************************
  1155. **                                                            **
  1156. ** Interaction between the application and the opened projects**
  1157. ***************************************************************/
  1158.  
  1159. CONST PROJECTNODE_ID=100
  1160.  
  1161. PROC projectList_dispatcher(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO msg)
  1162. DEF methodid
  1163.     methodid:=msg.methodid
  1164.     SELECT methodid
  1165.     CASE OM_NEW                   ; RETURN projectList_new(cl,obj,msg)
  1166.     CASE OM_DISPOSE               ; RETURN projectList_dispose(cl,obj,msg)
  1167.     CASE MUIM_Setup               ; RETURN projectList_setup(cl,obj,msg)
  1168.     CASE MUIM_Cleanup             ; RETURN projectList_cleanup(cl,obj,msg)
  1169.     CASE MUIM_ProjectList_DelItem ; RETURN projectList_delitem(cl,obj/*,msg*/)
  1170.     CASE MUIM_ProjectList_Exit    ; RETURN projectList_exit(cl,obj/*,msg*/)
  1171.     CASE MUIM_ProjectList_Forward ; RETURN projectList_forward(cl,obj,msg)
  1172.     CASE MUIM_ProjectList_Memory  ; RETURN projectList_memory(cl,obj/*,msg*/)
  1173.     CASE MUIM_ProjectList_NewItem ; RETURN projectList_newitem(cl,obj/*,msg*/)
  1174.     CASE MUIM_ProjectList_Notify  ; RETURN projectList_notify(cl,obj,msg)
  1175.     CASE MUIM_ProjectList_Prefs   ; RETURN projectList_prefs(/*cl,obj,*/msg)
  1176.     CASE MUIM_ProjectList_Refresh ; RETURN projectList_refresh(cl,obj,msg)
  1177.     CASE MUIM_ProjectList_SetPri  ; RETURN projectList_setpri(cl,obj,msg)
  1178.     CASE MUIM_ProjectList_ShowMe  ; RETURN projectList_showme(cl,obj,msg)
  1179.     ENDSELECT
  1180. ENDPROC doSuperMethodA(cl,obj,msg)
  1181.  
  1182. PROC getcurrent(data:PTR TO projectList_data,obj:PTR TO object)
  1183. DEF active
  1184. DEF exec_list:PTR TO lh,worknode:PTR TO project_Node,z,list:PTR TO mlh,cs:PTR TO object
  1185.     get(obj,MUIA_List_Active,{active})
  1186.     IF active=MUIV_List_Active_Off THEN RETURN 0
  1187.     exec_list:=data.exec_list
  1188.     worknode:=exec_list.head
  1189.               /* I should add here a check that the bound of the list is never reached!*/
  1190.     IF active > 0
  1191.         FOR z:=1 TO active
  1192.             worknode:=worknode.ln.succ
  1193.         ENDFOR
  1194.     ENDIF
  1195.     get(worknode.window,MUIA_Window_RootObject,{z})
  1196.  
  1197.     get(z,MUIA_Group_ChildList,{list})
  1198.     cs:=list.head
  1199. ENDPROC NextObject({cs}),worknode.window
  1200.  
  1201. /*Care! getp() asks the ProjectID and not line number!!!*/
  1202.  
  1203. PROC getp(data:PTR TO projectList_data,pid)
  1204. DEF exec_list:PTR TO lh,worknode:PTR TO project_Node,z,list:PTR TO mlh,cs:PTR TO object
  1205.  
  1206.     exec_list:=data.exec_list
  1207.     worknode:=exec_list.head
  1208.               /* I should add here a check that the bound of the list is never reached!*/
  1209.     WHILE mcomp(worknode,pid)
  1210.         worknode:=worknode.ln.succ
  1211.     ENDWHILE
  1212.     IF worknode.ln.succ = 0
  1213.         z:=String(80)
  1214.         StringF(z,cat.msgm_NoID.getstr(),pid)
  1215.         message(-1,z)
  1216.         DisposeLink(z)
  1217.         RETURN 0,0
  1218.     ENDIF
  1219.     get(worknode.window,MUIA_Window_RootObject,{z})
  1220.  
  1221.     get(z,MUIA_Group_ChildList,{list})
  1222.     cs:=list.head
  1223. ENDPROC NextObject({cs}),worknode.window
  1224.  
  1225. PROC mcomp(node:PTR TO project_Node,id)
  1226.     IF node.ln.succ=0 THEN RETURN FALSE -> This silly proc to avoid a atupid enforcer hit :-s
  1227. ENDPROC (node.pid <> id)
  1228.  
  1229. PROC getdata(data:PTR TO projectList_data,pid)
  1230. DEF gad
  1231.     gad:=getp(data,pid)
  1232.     IF gad = 0 THEN RETURN 0
  1233. ENDPROC INST_DATA(cl_planefunc.mcc_class,gad)
  1234.  
  1235. PROC projectList_new(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO msg)
  1236. DEF exec_list:PTR TO lh,data:PTR TO projectList_data
  1237. DEF port,req
  1238.     IF (obj:=doSuperMethodA(cl,obj,msg)) = FALSE THEN RETURN FALSE
  1239.     data:=INST_DATA(cl,obj)
  1240.     NEW exec_list
  1241.     newList(exec_list) -> Create an Exec list for the opened projects
  1242.     data.exec_list:=exec_list -> save the list in the instance data
  1243.  
  1244.     data.title:=String(150)
  1245.  
  1246.     port := CreateMsgPort() -> Check here that port exists
  1247.     data.port:=port
  1248.     req := CreateIORequest(data.port,SIZEOF timerequest) -> Check here that req exists
  1249.     data.req:=req
  1250.     OpenDevice(TIMERNAME,UNIT_VBLANK,data.req,0) -> NIL if it went all right, check it
  1251.     data.ihnode.ihn_millis  := 5000 -> Update memory display every five seconds
  1252.     data.ihnode.ihn_object  := obj
  1253.     data.ihnode.ihn_method  := MUIM_ProjectList_Memory
  1254.     data.ihnode.ihn_flags   := MUIIHNF_TIMER
  1255. ENDPROC obj
  1256.  
  1257. PROC projectList_setup(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO muip_setup)
  1258. DEF id,data:PTR TO projectList_data
  1259.     IF doSuperMethodA(cl,obj,msg) = FALSE THEN RETURN FALSE
  1260.     data:=INST_DATA(cl,obj)
  1261.     IF (msg.renderinfo.mri_flags AND MUIMRI_TRUECOLOR) = 0
  1262.         message(-1,cat.msgm_NoCgx.getstr())
  1263.         message(-1,cat.msgm_NoDraw.getstr())
  1264.         nodraw:=MUI_TRUE
  1265.     ELSEIF nodraw=MUI_TRUE
  1266.         nodraw:=FALSE
  1267.         message(-1,cat.msgm_CgxOk.getstr())
  1268.         message(-1,cat.msgm_DrawOk.getstr())
  1269.     ENDIF
  1270.     id:=GetVPModeID(msg.renderinfo.mri_screen.viewport) AND $FFF00000
  1271.         /*This is only due to my observation, that first three
  1272.          quartets "seem" to be constant for a given monitor*/
  1273.  
  1274.     SELECT id
  1275.     CASE $40d00000 /*cgx*/  /* what about IsCyberModeID() ? */
  1276.         IF pi96base
  1277.             CloseLibrary(pi96base)
  1278.             pi96base:=0
  1279.         ENDIF
  1280.         IF Not(cybergfxbase) THEN cybergfxbase:=OpenLibrary('cybergraphics.library',0)
  1281.         IF cybergfxbase=0
  1282.             messagefmt(-1,cat.msg_Nolib.getstr(), 'cybergraphics.library')
  1283.         ELSE
  1284.             messagefmt(-1,cat.msgm_useDriver.getstr(),'Cybergraph''x')
  1285.         ENDIF
  1286.     CASE $50000000 /*p96*/
  1287.         IF cybergfxbase
  1288.             CloseLibrary(cybergfxbase)
  1289.             cybergfxbase:=0
  1290.         ENDIF
  1291.         IF Not(pi96base) THEN pi96base:=OpenLibrary('Picasso96API.library',0)
  1292.         IF pi96base=0
  1293.             messagefmt(-1,cat.msg_Nolib.getstr(),'Picasso96API.library')
  1294.         ELSE
  1295.             messagefmt(-1,cat.msgm_useDriver.getstr(),'Picasso96')
  1296.         ENDIF
  1297.     CASE $00000000 /*aga*/
  1298.         IF cybergfxbase
  1299.             CloseLibrary(cybergfxbase)
  1300.             cybergfxbase:=0
  1301.         ENDIF
  1302.         IF pi96base
  1303.             CloseLibrary(pi96base)
  1304.             pi96base:=0
  1305.         ENDIF
  1306.         message(-1,cat.msgm_AgaSorry1.getstr())
  1307.         message(-1,cat.msgm_AgaSorry2.getstr())
  1308.     DEFAULT
  1309.         message(-1,cat.msgm_UnknownMode.getstr())
  1310.         IF cybergfxbase
  1311.             CloseLibrary(cybergfxbase)
  1312.             cybergfxbase:=0
  1313.         ENDIF
  1314.         IF pi96base
  1315.             CloseLibrary(pi96base)
  1316.             pi96base:=0
  1317.         ENDIF
  1318.     ENDSELECT
  1319.  
  1320.     data.req.io.command := TR_ADDREQUEST
  1321.     data.req.time.secs    := 5 -> Update every five seconds
  1322.     data.req.time.micro   := 0
  1323.     SendIO(data.req)
  1324.     doMethodA(_app(obj),[MUIM_Application_AddInputHandler,data.ihnode])
  1325.  
  1326.     initfuncs({getdata},data,pi96base) -> initialization of parser.m
  1327.  
  1328. ENDPROC MUI_TRUE
  1329.  
  1330. PROC projectList_cleanup(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO msg)
  1331. DEF data:PTR TO projectList_data
  1332.     data := INST_DATA(cl,obj)
  1333.     doMethodA(_app(obj),[MUIM_Application_RemInputHandler,data.ihnode])
  1334.     IF (CheckIO(data.req)=NIL) THEN AbortIO(data.req)
  1335.     WaitIO(data.req)
  1336. ENDPROC (doSuperMethodA(cl,obj,msg))
  1337.  
  1338. PROC projectList_dispose(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO msg)
  1339. DEF worknode:PTR TO project_Node, nextnode,exec_list:PTR TO lh,data:PTR TO projectList_data
  1340.     data:=INST_DATA(cl,obj)
  1341.     exec_list:=data.exec_list
  1342.     worknode:=exec_list.head  -> First node
  1343.     IF worknode
  1344.         WHILE nextnode:=worknode.ln.succ
  1345.             END worknode;worknode:=nextnode
  1346.         ENDWHILE
  1347.     ENDIF
  1348.  
  1349.     DisposeLink(data.title)
  1350.  
  1351.     IF (data.req)
  1352.         IF (data.req.io.device) THEN CloseDevice(data.req)
  1353.         DeleteIORequest(data.req)
  1354.     ENDIF
  1355.     IF (data.port) THEN DeleteMsgPort(data.port)
  1356. ENDPROC doSuperMethodA(cl,obj,msg)
  1357.  
  1358. PROC projectList_delitem(cl:PTR TO iclass,obj:PTR TO object/*,msg:PTR TO msg*/)
  1359. DEF data:PTR TO projectList_data,gad,window,state,
  1360.   node:PTR TO project_Node
  1361.  
  1362. quiet:=TRUE /*prevents the opened projects list from refreshing the display*/
  1363.     data:=INST_DATA(cl,obj)
  1364.     gad,window:=getcurrent(data,obj)
  1365.     doMethodA(gad,[MUIM_PlaneFunc_Abort,MUIV_PlaneFunc_Abort_Abort])/*aborts the task, if necessary*/
  1366.     get(gad,MUIA_PlaneFunc_ProjectNode,{node})
  1367.     get(gad,MUIA_PlaneFunc_State,{state})
  1368.     IF state = MUIV_PlaneFunc_State_Frozen
  1369.         message(node.pid,cat.msgm_RemVsFreeze.getstr())
  1370.         RETURN
  1371.     ENDIF
  1372.     doMethodA(obj,[MUIM_List_Remove,MUIV_List_Remove_Active])/*removes the name from the list*/
  1373.     DisposeLink(node.item)
  1374.     set(window,MUIA_Window_Open,FALSE)/*Closes the window*/
  1375.     doMethodA(app,[OM_REMMEMBER,window])
  1376.     Mui_DisposeObject(window) /*Removes the window and the PlaneFuncObject*/
  1377.     Remove(node)
  1378.     END node
  1379.     currid:=-1 -> This is to prevent projectList to change that unexistant project's priority
  1380. quiet:=FALSE
  1381.     doMethodA(obj,[MUIM_ProjectList_Refresh,0])
  1382. ENDPROC
  1383.  
  1384. PROC projectList_exit(cl:PTR TO iclass,obj:PTR TO object/*,msg:PTR TO msg*/)
  1385. DEF gad,data:PTR TO projectList_data,str[40]:STRING,pid
  1386. DEF exec_list:PTR TO lh,worknode:PTR TO project_Node,z,list:PTR TO mlh,cs:PTR TO object
  1387.     ->WriteF('Executing exit method...\n')
  1388.     data:=INST_DATA(cl,obj)
  1389.     exec_list:=data.exec_list
  1390.     worknode:=exec_list.head
  1391.     WHILE worknode.ln.succ
  1392.         get(worknode.window,MUIA_Window_RootObject,{z})
  1393.         get(z,MUIA_Group_ChildList,{list})
  1394.         cs:=list.head
  1395.         gad:=NextObject({cs})
  1396.         get(gad,MUIA_PlaneFunc_ProjectID,{pid})
  1397.         StringF(str,cat.msgm_Removing.getstr(),pid)
  1398.         message(-1,str)
  1399.         doMethodA(gad,[MUIM_PlaneFunc_Abort,MUIV_PlaneFunc_Abort_Abort])
  1400.         worknode:=worknode.ln.succ
  1401.     ENDWHILE
  1402. ENDPROC
  1403.  
  1404. PROC projectList_forward(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO args_forward)
  1405. DEF gad,data:PTR TO projectList_data
  1406.     data:=INST_DATA(cl,obj)
  1407.     gad:=getcurrent(data,obj)
  1408.     IF msg.method=MUIM_PlaneFunc_Abort
  1409.         doMethodA(gad,[MUIM_PlaneFunc_Abort,MUIV_PlaneFunc_Abort_Abort])
  1410.     ELSE
  1411.         doMethodA(gad,[msg.method])
  1412.     ENDIF
  1413. ENDPROC
  1414.  
  1415. PROC projectList_memory(cl:PTR TO iclass,obj:PTR TO object)
  1416. DEF win:PTR TO object,data:PTR TO projectList_data
  1417.     data:=INST_DATA(cl,obj)
  1418.  
  1419.     StringF(data.title,'\s - \d Chip - \d Fast - \d Total',PICVERSION,AvailMem(MEMF_CHIP),AvailMem(MEMF_FAST),AvailMem(MEMF_ANY))
  1420.     get(obj,MUIA_WindowObject,{win})
  1421.     set(win,MUIA_Window_ScreenTitle,data.title)
  1422. ENDPROC
  1423.  
  1424. PROC projectList_newitem(cl:PTR TO iclass,obj:PTR TO object/*,msg:PTR TO msg*/)
  1425. DEF window, pfunc,vscroll,hscroll,pid,
  1426. name:PTR TO CHAR,node:PTR TO project_Node,inlist:PTR TO CHAR,
  1427. exec_list:PTR TO lh,data:PTR TO projectList_data,
  1428. pdata:PTR TO planeFunc_data
  1429.  
  1430.     data:=INST_DATA(cl,obj);exec_list:=data.exec_list
  1431.     NEW node
  1432.     window:=WindowObject,
  1433.         MUIA_Window_ScreenTitle, PICVERSION,
  1434.         ->MUIA_Window_UseRightBorderScroller,MUI_TRUE,
  1435.         MUIA_Window_UseBottomBorderScroller,MUI_TRUE,
  1436.         WindowContents,
  1437.             HGroup,
  1438.                 MUIA_Group_Spacing,0,
  1439.                 Child, pfunc:=PlaneFuncObject,End,
  1440.                 Child, vscroll:=ScrollbarObject,
  1441.                     MUIA_FixWidth,20,
  1442.                     ->MUIA_Prop_UseWinBorder,MUIV_Prop_UseWinBorder_Right, /*This is an MUI bug, the refreshing is not done correctely when having a scroller in the right border..*/
  1443.                     MUIA_Prop_Entries,255,MUIA_Prop_Visible,255,
  1444.                 End,
  1445.                 Child, hscroll:=PropObject,
  1446.                     MUIA_Prop_UseWinBorder,MUIV_Prop_UseWinBorder_Bottom,
  1447.                     MUIA_Prop_Entries,255,MUIA_Prop_Visible,255,
  1448.                 End,
  1449.             End,
  1450.         End
  1451.  
  1452.     set(vscroll,MUIA_Prop_Entries,255) -> entries not set correctely..
  1453.  
  1454.     doMethodA(app,[OM_ADDMEMBER,window])  /* now the project window is ready;*/
  1455.     get(pfunc,MUIA_PlaneFunc_Name,{name}) /* the PlaneFunc class has also initialised.*/
  1456.     set(window,MUIA_Window_Title,name) -> Read the default PlaneFunc name
  1457.     pdata:=INST_DATA(cl_planefunc.mcc_class,pfunc)
  1458.     pdata.hscroll:=hscroll
  1459.     pdata.vscroll:=vscroll
  1460.     doMethodA(hscroll,[MUIM_Notify,MUIA_Prop_First,MUIV_EveryTime,pfunc,3,MUIM_Set,MUIA_PlaneFunc_Left,MUIV_TriggerValue])
  1461.     doMethodA(vscroll,[MUIM_Notify,MUIA_Prop_First,MUIV_EveryTime,pfunc,3,MUIM_Set,MUIA_PlaneFunc_Top,MUIV_TriggerValue])
  1462.     doMethodA(window,[MUIM_Notify,MUIA_Window_CloseRequest,MUI_TRUE,pfunc,1,MUIM_PlaneFunc_Close])
  1463.     node.window:=window
  1464.     node.ln.name:=name
  1465.     node.ln.type:=PROJECTNODE_ID
  1466.     node.ln.pri:=0
  1467.     inlist:=String(40)
  1468.     node.item:=inlist
  1469.     get(pfunc,MUIA_PlaneFunc_ProjectID,{pid})
  1470.     node.pid:=pid
  1471.     AddTail(exec_list,node)
  1472.  
  1473.     set(pfunc,MUIA_PlaneFunc_ProjectNode,node)
  1474.  
  1475.     StringF(inlist,'\d :\s',lastid-1,name)
  1476.     doMethodA(obj,[MUIM_List_InsertSingle,inlist,MUIV_List_Insert_Bottom])
  1477.     set(window,MUIA_Window_Open,MUI_TRUE) -> Open the window when everything is finished
  1478.     set(obj,MUIA_List_Active,MUIV_List_Active_Bottom)
  1479.     doMethodA(obj,[MUIM_ProjectList_Memory]) -> Update memory display when opening a project
  1480. ENDPROC
  1481.  
  1482. PROC projectList_notify(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO args_notify)
  1483. DEF data:PTR TO projectList_data,gadid,z,gad,value,pid,node:PTR TO project_Node
  1484.     data:=INST_DATA(cl,obj)
  1485.     gad:=getcurrent(data,obj)
  1486.     value:=msg.value
  1487.     gadid:=msg.gadget
  1488.     SELECT gadid
  1489.     CASE MUIV_ProjectList_Notify_Name
  1490.         set(gad,MUIA_PlaneFunc_Name,value)
  1491.         get(gad,MUIA_PlaneFunc_State,{z})
  1492.         IF (z=MUIV_PlaneFunc_State_Drawing) OR (value=MUIV_PlaneFunc_State_Loading)
  1493.             z:=33
  1494.         ELSE
  1495.             z:=32
  1496.         ENDIF
  1497.         get(gad,MUIA_PlaneFunc_ProjectID,{pid})
  1498.         get(gad,MUIA_PlaneFunc_ProjectNode,{node})
  1499.         StringF(node.item,'\d\c:\s',pid,z,value)
  1500.         doMethodA(obj,[MUIM_List_Redraw,MUIV_List_Redraw_Active])
  1501.     CASE MUIV_ProjectList_Notify_Type
  1502.         SELECT value
  1503.         CASE 0
  1504.             set(gad,MUIA_PlaneFunc_Type,MUIV_PlaneFunc_Type_DTPic)
  1505.         CASE 1
  1506.             set(gad,MUIA_PlaneFunc_Type,MUIV_PlaneFunc_Type_Graph)
  1507.         ENDSELECT
  1508.     CASE MUIV_ProjectList_Notify_ImageFile
  1509.         set(gad,MUIA_PlaneFunc_ImageFile,value)
  1510.     CASE MUIV_ProjectList_Notify_LoadM
  1511.         SELECT value
  1512.         CASE 0
  1513.             set(gad,MUIA_PlaneFunc_LoadM,MUIV_PlaneFunc_LoadM_Scale)
  1514.         CASE 1
  1515.             set(gad,MUIA_PlaneFunc_LoadM,MUIV_PlaneFunc_LoadM_CutTile)
  1516.         CASE 2
  1517.             set(gad,MUIA_PlaneFunc_LoadM,MUIV_PlaneFunc_LoadM_ChangeSize)
  1518.         ENDSELECT
  1519.     CASE MUIV_ProjectList_Notify_Red
  1520.         set(gad,MUIA_PlaneFunc_Rstr,value)
  1521.     CASE MUIV_ProjectList_Notify_Green
  1522.         set(gad,MUIA_PlaneFunc_Gstr,value)
  1523.     CASE MUIV_ProjectList_Notify_Blue
  1524.         set(gad,MUIA_PlaneFunc_Bstr,value)
  1525.     CASE MUIV_ProjectList_Notify_OutputR
  1526.         set(gad,MUIA_PlaneFunc_OutputR,value)
  1527.     CASE MUIV_ProjectList_Notify_OutputG
  1528.         set(gad,MUIA_PlaneFunc_OutputG,value)
  1529.     CASE MUIV_ProjectList_Notify_OutputB
  1530.         set(gad,MUIA_PlaneFunc_OutputB,value)
  1531.     CASE MUIV_ProjectList_Notify_Width
  1532.         set(gad,MUIA_PlaneFunc_Width,Val(value))
  1533.     CASE MUIV_ProjectList_Notify_Height
  1534.         set(gad,MUIA_PlaneFunc_Height,Val(value))
  1535.     ENDSELECT
  1536. ENDPROC
  1537.  
  1538. PROC projectList_prefs(msg:PTR TO args_prefs) -> a future version may require semaphore, but not for now.
  1539.     msg.var[]:=msg.value
  1540. ENDPROC
  1541.  
  1542. /*This method reads all attributes of the current class and writes the state of the gadgets
  1543. in the settings window*/
  1544. PROC projectList_refresh(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO args_refresh)
  1545. DEF data:PTR TO projectList_data,nm:PTR TO CHAR,gad,value,q[11]:STRING,pid,win
  1546. DEF exec_list:PTR TO lh,worknode:PTR TO project_Node, count=0,ogad
  1547.  
  1548.     IF quiet=TRUE THEN RETURN
  1549.     data:=INST_DATA(cl,obj)
  1550.     gad,win:=getcurrent(data,obj)
  1551.     IF gad=NIL
  1552.         set(sgroup,MUIA_Disabled,MUI_TRUE)
  1553.         currid:=-1
  1554.         RETURN
  1555.     ENDIF
  1556.     set(sgroup,MUIA_Disabled,FALSE)
  1557.     get(gad,MUIA_PlaneFunc_ProjectID,{pid})
  1558.     IF pid <> currid /*was currid and will be pid*/
  1559.         IF currid > -1
  1560.             ogad:=getp(data,currid)
  1561.             doMethodA(ogad,[MUIM_PlaneFunc_SetTaskPri,rp])
  1562.         ENDIF
  1563.         doMethodA(gad,[MUIM_PlaneFunc_SetTaskPri,cp])
  1564.     ENDIF
  1565.  
  1566.     currid:=pid
  1567.     IF msg.ostate=FALSE
  1568.         doMethodA(gad,[MUIM_PlaneFunc_Lamps])
  1569.         StringF(q,'r(\d,x,y)=',pid)
  1570.         set(r_lbl,MUIA_Text_Contents,q)
  1571.         StringF(q,'g(\d,x,y)=',pid)
  1572.         set(g_lbl,MUIA_Text_Contents,q)
  1573.         StringF(q,'b(\d,x,y)=',pid)
  1574.         set(b_lbl,MUIA_Text_Contents,q)
  1575.         get(gad,MUIA_PlaneFunc_Name,{value})
  1576.         nnset(name_str,MUIA_String_Contents,value)   /*nnset to avoid triggering useless notification*/
  1577.         get(gad,MUIA_PlaneFunc_Type,{value})
  1578.         SELECT value
  1579.         CASE MUIV_PlaneFunc_Type_DTPic
  1580.             nnset(type_reg,MUIA_Group_ActivePage,0)
  1581.         CASE MUIV_PlaneFunc_Type_Graph
  1582.             nnset(type_reg,MUIA_Group_ActivePage,1)
  1583.         ENDSELECT
  1584.  
  1585.         get(gad,MUIA_PlaneFunc_LoadM,{value})  /* these are for image-projects*/
  1586.         SELECT value                           
  1587.         CASE MUIV_PlaneFunc_LoadM_Scale        /* but all settings are updated, so that */   
  1588.             nnset(size_rad,MUIA_Radio_Active,0)/* the user may change the selected page and*/
  1589.         CASE MUIV_PlaneFunc_LoadM_CutTile      /*see the current settings..*/                
  1590.             nnset(size_rad,MUIA_Radio_Active,1)
  1591.         CASE MUIV_PlaneFunc_LoadM_ChangeSize
  1592.             nnset(size_rad,MUIA_Radio_Active,2)
  1593.         ENDSELECT
  1594.         get(gad,MUIA_PlaneFunc_ImageFile,{value})
  1595.         nnset(path_str,MUIA_String_Contents,value)
  1596.  
  1597.         get(gad,MUIA_PlaneFunc_Rstr,{value})   /*these are for function-projects*/
  1598.         nnset(red_str,MUIA_String_Contents,value)
  1599.         get(gad,MUIA_PlaneFunc_Gstr,{value})
  1600.         nnset(green_str,MUIA_String_Contents,value)
  1601.         get(gad,MUIA_PlaneFunc_Bstr,{value})
  1602.         nnset(blue_str,MUIA_String_Contents,value)
  1603.         get(gad,MUIA_PlaneFunc_OutputR,{value})
  1604.         nnset(outr_cyc,MUIA_Cycle_Active,value)
  1605.         get(gad,MUIA_PlaneFunc_OutputG,{value})
  1606.         nnset(outg_cyc,MUIA_Cycle_Active,value)
  1607.         get(gad,MUIA_PlaneFunc_OutputB,{value})
  1608.         nnset(outb_cyc,MUIA_Cycle_Active,value)
  1609.  
  1610.  
  1611.         get(gad,MUIA_PlaneFunc_Width,{value})
  1612.         nnset(width_str,MUIA_String_Integer,value)
  1613.         get(gad,MUIA_PlaneFunc_Height,{value})
  1614.         nnset(height_str,MUIA_String_Integer,value)
  1615.         get(win,MUIA_Window_Open,{value})
  1616.         nnset(showme_cyc,MUIA_Cycle_Active,value)
  1617.     ENDIF
  1618.     IF (msg.ostate = FALSE) OR (msg.ostate-2=pid)
  1619.         setlamp(gad)
  1620.     ENDIF
  1621.     IF msg.ostate > 0
  1622.         pid:=msg.ostate-2
  1623.         gad:=getp(data,pid)
  1624.         get(gad,MUIA_PlaneFunc_Name,{nm})
  1625.         get(gad,MUIA_PlaneFunc_State,{value})
  1626.         IF (value=MUIV_PlaneFunc_State_Drawing) OR (value=MUIV_PlaneFunc_State_Loading)
  1627.             value:=33
  1628.         ELSE
  1629.             value:=32
  1630.         ENDIF
  1631.  
  1632.         exec_list:=data.exec_list
  1633.         worknode:=exec_list.head
  1634.         WHILE worknode.pid <> pid
  1635.             count++
  1636.             worknode:=worknode.ln.succ
  1637.         ENDWHILE
  1638.  
  1639.         StringF(worknode.item,'\d\c:\s',pid,value,nm)
  1640.         doMethodA(obj,[MUIM_List_Redraw,count])
  1641.     ENDIF
  1642. ENDPROC
  1643.  
  1644. PROC setlamp(gad:PTR TO object)
  1645. DEF value
  1646.     get(gad,MUIA_PlaneFunc_State,{value})
  1647.     SELECT value
  1648.     CASE MUIV_PlaneFunc_State_Idle
  1649.         set(state_txt,MUIA_Text_Contents,cat.msgs_Idle.getstr())
  1650.         set(lamp_lmp,MUIA_Lamp_Color,MUIV_Lamp_Color_Off)
  1651.         set(state_gau,MUIA_Gauge_Current,0)
  1652.         set(draw_btn,MUIA_Text_Contents,cat.msgl_Render.getstr())
  1653.     CASE MUIV_PlaneFunc_State_Drawing
  1654.         set(state_txt,MUIA_Text_Contents,cat.msgs_Drawing.getstr())
  1655.         set(lamp_lmp,MUIA_Lamp_Color,MUIV_Lamp_Color_Processing)
  1656.         get(gad,MUIA_PlaneFunc_Percent,{value})
  1657.         set(state_gau,MUIA_Gauge_Current,value)
  1658.         set(draw_btn,MUIA_Text_Contents,cat.msgl_Pause.getstr())
  1659.     CASE MUIV_PlaneFunc_State_Loading
  1660.         set(state_txt,MUIA_Text_Contents,cat.msgs_Loading.getstr())
  1661.         set(lamp_lmp,MUIA_Lamp_Color,MUIV_Lamp_Color_LoadingData)
  1662.         get(gad,MUIA_PlaneFunc_Percent,{value})
  1663.         set(state_gau,MUIA_Gauge_Current,value)
  1664.         set(draw_btn,MUIA_Text_Contents,cat.msgl_Pause.getstr())
  1665.     CASE MUIV_PlaneFunc_State_Paused
  1666.         set(state_txt,MUIA_Text_Contents,cat.msgs_Paused.getstr())
  1667.         set(lamp_lmp,MUIA_Lamp_Color,MUIV_Lamp_Color_Ok)
  1668.         get(gad,MUIA_PlaneFunc_Percent,{value})
  1669.         set(state_gau,MUIA_Gauge_Current,value)
  1670.         set(draw_btn,MUIA_Text_Contents,cat.msgl_Restart.getstr())
  1671.     CASE MUIV_PlaneFunc_State_Frozen
  1672.         set(state_txt,MUIA_Text_Contents,cat.msgs_Frozen.getstr())
  1673.         set(lamp_lmp,MUIA_Lamp_Color,MUIV_Lamp_Color_SendingData)
  1674.         set(state_gau,MUIA_Gauge_Current,0)
  1675.         set(draw_btn,MUIA_Text_Contents,cat.msgl_Render.getstr())
  1676.     ENDSELECT
  1677. ENDPROC
  1678.  
  1679. PROC projectList_setpri(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO args_setpri)
  1680. DEF data:PTR TO projectList_data,task,
  1681. gad
  1682. DEF worknode:PTR TO project_Node, nextnode,exec_list:PTR TO lh,list:PTR TO mlh,cs:PTR TO object,z
  1683.     data:=INST_DATA(cl,obj)
  1684.     task:=msg.task
  1685.     SELECT task
  1686.     CASE MUIV_ProjectList_SetPri_Main
  1687.         SetTaskPri(FindTask(0),msg.value)
  1688.     CASE MUIV_ProjectList_SetPri_Render
  1689.         rp:=msg.value
  1690.  
  1691.         exec_list:=data.exec_list
  1692.         worknode:=exec_list.head  -> First node
  1693.         IF worknode
  1694.             WHILE nextnode:=worknode.ln.succ
  1695.                 IF worknode.pid <> currid
  1696.                     get(worknode.window,MUIA_Window_RootObject,{z})
  1697.                     get(z,MUIA_Group_ChildList,{list})
  1698.                     cs:=list.head
  1699.                     gad:=NextObject({cs})
  1700.                     doMethodA(gad,[MUIM_PlaneFunc_SetTaskPri,rp])
  1701.                 ENDIF
  1702.                 worknode:=nextnode
  1703.             ENDWHILE
  1704.         ENDIF
  1705.  
  1706.     CASE MUIV_ProjectList_SetPri_Curr
  1707.         cp:=msg.value
  1708.         gad:=getcurrent(data,obj)
  1709.         IF gad
  1710.             doMethodA(gad,[MUIM_PlaneFunc_SetTaskPri,cp])
  1711.         ENDIF
  1712.     ENDSELECT
  1713. ENDPROC
  1714.  
  1715. PROC projectList_showme(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO args_showme)
  1716. DEF win,data:PTR TO projectList_data
  1717. DEF exec_list:PTR TO lh,active,worknode:PTR TO project_Node,z->,qe[30]:STRING
  1718.  
  1719.     data:=INST_DATA(cl,obj)
  1720.  
  1721.     exec_list:=data.exec_list
  1722.     get(obj,MUIA_List_Active,{active})
  1723.     /*get item number "active" of the exec_list (isn't any faster way to do it?)*/
  1724.     worknode:=exec_list.head
  1725.               /* I should add here a check that the bound of the list is never reached!*/
  1726.     IF active > 0
  1727.         FOR z:=1 TO active DO worknode:=worknode.ln.succ
  1728.     ENDIF -> now worknode is the node of the wanted project
  1729.     win:=worknode.window
  1730.     set(win,MUIA_Window_Open,msg.value)
  1731.     /*StringF(qe,'set(\d,MUIA_Window_Open,\d)',win,msg.value)
  1732.     message(active,qe)*/
  1733. ENDPROC
  1734.  
  1735. /***************************************************************
  1736. ** custom uSlider private subclass of Slider class            **
  1737. ****************************************************************
  1738. *                                                              *
  1739. *Simple sub-class of Slider, overriding MUIM_Numeric_Stringify *
  1740. *                                                              *
  1741. ***************************************************************/
  1742. PROC uslider_dispatcher(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO muip_numeric_stringify)
  1743. DEF data:PTR TO uslider_data,methodid
  1744.     methodid:=msg.methodid
  1745.     SELECT methodid
  1746.     CASE OM_NEW;RETURN uslider_new(cl,obj,msg)
  1747.     CASE MUIM_Numeric_Stringify
  1748.         data:=INST_DATA(cl,obj)
  1749.         IF data.stringify=MUI_TRUE
  1750.             IF msg.value = 0
  1751.                 StrCopy(data.buffer,cat.msgp_guNone.getstr())
  1752.             ELSEIF msg.value=1
  1753.                 StringF(data.buffer,'\d \s',msg.value,cat.msgp_Pixel.getstr())
  1754.             ELSE
  1755.                 StringF(data.buffer,'\d \s',msg.value,cat.msgp_Pixels.getstr())
  1756.             ENDIF
  1757.             RETURN data.buffer
  1758.         ENDIF
  1759.     CASE MUIM_uSlider_Bigger;RETURN uslider_bigger(obj,msg)
  1760.     CASE MUIM_uSlider_Smaller;RETURN uslider_smaller(obj,msg)
  1761.     CASE MUIM_Cleanup
  1762.         data:=INST_DATA(cl,obj)
  1763.         IF data.stringify THEN
  1764.             DisposeLink(data.buffer)
  1765.     ENDSELECT
  1766. ENDPROC doSuperMethodA(cl,obj,msg)
  1767.  
  1768. PROC uslider_new(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO opset)
  1769. DEF data:PTR TO uslider_data,
  1770.     tags:PTR TO tagitem,
  1771.     tag:PTR TO tagitem
  1772.  
  1773.     IF (obj:=doSuperMethodA(cl,obj,msg))=NIL THEN RETURN 0
  1774.  
  1775.     data:=INST_DATA(cl,obj)
  1776.     tags:=msg.attrlist
  1777.     WHILE tag:=NextTagItem({tags})
  1778.         IF tag.tag=MUIA_uSlider_Stringify
  1779.             data.stringify:=tag.data
  1780.             data.buffer:=String(10)
  1781.         ENDIF
  1782.     ENDWHILE
  1783. ENDPROC obj
  1784.  
  1785. PROC uslider_bigger(obj:PTR TO object,msg:PTR TO args_compare)
  1786. DEF level
  1787.     get(obj,MUIA_Slider_Level,{level})
  1788.     IF level < msg.than THEN
  1789.         nnset(obj,MUIA_Slider_Level,msg.than)
  1790. ENDPROC
  1791.  
  1792. PROC uslider_smaller(obj:PTR TO object,msg:PTR TO args_compare)
  1793. DEF level
  1794.     get(obj,MUIA_Slider_Level,{level})
  1795.     IF level > msg.than THEN
  1796.         nnset(obj,MUIA_Slider_Level,msg.than)
  1797. ENDPROC
  1798.  
  1799. /***************************************************************
  1800. ** sizetxt class                                              **
  1801. ****************************************************************
  1802. *  textobject containing the size of the last loaded picture.  *
  1803. ***************************************************************/
  1804.  
  1805. OBJECT sizetxt_data
  1806.     buffer:PTR TO CHAR
  1807. ENDOBJECT
  1808.  
  1809. CONST MUIM_SizeTxt_Update=$FCB93800
  1810.  
  1811. OBJECT muip_stupd
  1812.     methodid
  1813.     width,height,depth
  1814.     projectid
  1815. ENDOBJECT
  1816.  
  1817. PROC sizetxt_dispatcher(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO msg)
  1818. DEF methodid
  1819.     methodid:=msg.methodid
  1820.     SELECT methodid
  1821.     CASE OM_NEW;RETURN sizetxt_new(cl,obj,msg)
  1822.     CASE OM_DISPOSE;RETURN sizetxt_dispose(cl,obj,msg)
  1823.     CASE MUIM_SizeTxt_Update;RETURN sizetxt_update(cl,obj,msg)
  1824.     ENDSELECT
  1825. ENDPROC doSuperMethodA(cl,obj,msg)
  1826.  
  1827. PROC sizetxt_new(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO msg)
  1828. DEF data:PTR TO sizetxt_data
  1829.     obj:=doSuperMethodA(cl,obj,msg)
  1830.     data:=INST_DATA(cl,obj)
  1831.     data.buffer:=String(50)
  1832. ENDPROC obj
  1833.  
  1834. PROC sizetxt_dispose(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO msg)
  1835. DEF data:PTR TO sizetxt_data
  1836.     data:=INST_DATA(cl,obj)
  1837.     DisposeLink(data.buffer)
  1838. ENDPROC doSuperMethodA(cl,obj,msg)
  1839.  
  1840. PROC sizetxt_update(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO muip_stupd)
  1841. DEF data:PTR TO sizetxt_data
  1842.     data:=INST_DATA(cl,obj)
  1843.     IF msg.projectid = currid
  1844.         StringF(data.buffer,'\s\d×\d×\d',cat.msgl_PicSize.getstr(),msg.width,msg.height,msg.depth)
  1845.         set(obj,MUIA_Text_Contents,data.buffer)
  1846.     ENDIF
  1847. ENDPROC
  1848.  
  1849. PROC myapp_dispatcher(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO muip_application_returnid)
  1850.     ->WriteF('$\h\n',msg.methodid)
  1851.     IF msg.methodid=MUIM_Application_ReturnID
  1852.         IF msg.retid=MUIV_Application_ReturnID_Quit THEN /*separate IFs to avoid illegal memory access, if the message hasn't any argument*/
  1853.             doMethodA(opened_lst,[MUIM_ProjectList_Exit]) -> This will cause the Exit method to be executed right before
  1854.     ENDIF                                           -> ReturnId (when called with Exit returnid)
  1855. ENDPROC doSuperMethodA(cl,obj,msg)
  1856.  
  1857. /***************************************************************
  1858. ** Functions for easy and secure spawning/killing of subtasks **
  1859. ***************************************************************/
  1860.  
  1861. PROC sendsubtaskmsg(st:PTR TO subtask,command,params)
  1862.     st.st_Message.stm_Message.replyport:= st.st_Reply
  1863.     st.st_Message.stm_Message.length   := SIZEOF subtaskmsg
  1864.     st.st_Message.stm_Command          := command
  1865.     st.st_Message.stm_Parameter        := params
  1866.     st.st_Message.stm_Result           := 0
  1867.  
  1868.     PutMsg(IF command=STC_STARTUP THEN st.st_Task::process.msgport ELSE st.st_Port,st.st_Message)
  1869.     WaitPort(st.st_Reply)          /*gets the reply*/
  1870.     GetMsg(st.st_Reply)
  1871. ENDPROC (st.st_Message.stm_Result)
  1872.  
  1873. PROC spawnsubtask(name,func,data:PTR TO planeFunc_data)
  1874.     DEF st=NIL:PTR TO subtask
  1875.  
  1876.     IF (st:=AllocVec(SIZEOF subtask,MEMF_PUBLIC OR MEMF_CLEAR))
  1877.         st.st_Reply:=CreateMsgPort()
  1878.         IF (st.st_Reply)
  1879.             st.st_Data:=data
  1880.             st.st_Task:= CreateNewProc([NP_ENTRY,func,
  1881.                                         NP_NAME,name,
  1882.                                         TAG_DONE])
  1883.             IF (st.st_Task)
  1884.                 IF (sendsubtaskmsg(st,STC_STARTUP,st)) THEN RETURN (st)
  1885.             ENDIF
  1886.             DeleteMsgPort(st.st_Reply)
  1887.         ENDIF
  1888.         FreeVec(st)
  1889.     ENDIF
  1890. ENDPROC
  1891.  
  1892. PROC killsubtask(st:PTR TO subtask)
  1893.     sendsubtaskmsg(st,STC_SHUTDOWN,st)
  1894.     DeleteMsgPort(st.st_Reply)
  1895.     FreeVec(st)
  1896. ENDPROC
  1897.  
  1898. /*exitsubtask and initsubtask are called from the subtask*/
  1899. PROC exitsubtask(st:PTR TO subtask,stm:PTR TO subtaskmsg)
  1900.   /*
  1901.   ** We reply after a Forbid() to make sure we're really gone
  1902.   ** when the main task continues.
  1903.   */
  1904.   IF (st.st_Port) THEN DeleteMsgPort(st.st_Port)
  1905.   Forbid()
  1906.   stm.stm_Result:= FALSE
  1907.   ReplyMsg(stm)
  1908. ENDPROC
  1909.  
  1910. PROC initsubtask()
  1911.   DEF me=NIL:PTR TO tc,
  1912.       st=NIL:PTR TO subtask,
  1913.       stm=NIL:PTR TO subtaskmsg
  1914.  
  1915.   me:= FindTask(NIL)
  1916.  
  1917.   /*
  1918.   ** Wait for our startup message from the SpawnSubTask() function.
  1919.   */
  1920.  
  1921.   WaitPort(me::process.msgport)
  1922.   stm:= GetMsg(me::process.msgport)
  1923.   st:= stm.stm_Parameter
  1924.   st.st_Port:=CreateMsgPort()
  1925.   IF (st.st_Port)
  1926.     /*
  1927.     ** Reply startup message, everything ok.
  1928.     ** Note that if the initialization fails, the code falls
  1929.     ** through and replies the startup message with a stm_Result
  1930.     ** of 0 after a Forbid(). This tells SpawnSubTask() that the
  1931.     ** sub task failed to run.
  1932.     */
  1933.     stm.stm_Result:= TRUE
  1934.     ReplyMsg(stm)
  1935.     RETURN (st)
  1936.   ELSE
  1937.     exitsubtask(st,stm)
  1938.     RETURN (NIL)
  1939.   ENDIF
  1940. ENDPROC
  1941.  
  1942. /***************************************************************
  1943. **    Subtask which does all the time-consuming rendering     **
  1944. ***************************************************************/
  1945.  
  1946. PROC renderfunc()
  1947. DEF st=NIL:PTR TO subtask,
  1948.     data=NIL:PTR TO planeFunc_data,
  1949.     running=TRUE,worktodo=FALSE,x,y,
  1950.     stm=NIL:PTR TO subtaskmsg,
  1951.     command,i,
  1952.     red,green,blue,lr:PTR TO longreal,cnt,oldpixel
  1953.  
  1954.     geta4() -> !!!
  1955.  
  1956.     IF (st:= initsubtask())
  1957.         data:= st.st_Data
  1958.         LOOP
  1959.             /*
  1960.             ** after the sub task is up and running, we go into
  1961.             ** a loop and process the messages from the main task.
  1962.             */
  1963.             WHILE (stm:= GetMsg(st.st_Port))
  1964.                 command:=stm.stm_Command
  1965.                 SELECT command
  1966.                 CASE STC_SHUTDOWN
  1967.                     /*
  1968.                     ** This is the shutdown message from KillSubTask().
  1969.                     */
  1970.                     running:= FALSE
  1971.                     IF data.line
  1972.                         END data.line[data.width*(data.rupd+1)]
  1973.                         data.line:=0
  1974.                     ENDIF
  1975.                 CASE STC_START
  1976.                     ObtainSemaphore(data.sema)
  1977.                     data.drawn:=-1
  1978.                     data.calculated:=-1
  1979.                     DateStamp(data.ds)
  1980.                     ReleaseSemaphore(data.sema)
  1981.  
  1982.                     y:=0;cnt:=0->data.rupd
  1983.                     i:=0
  1984.                     NEW lr
  1985.                     worktodo:= TRUE
  1986.                     ->rproc:=data.rfunc.proc() -> Later :-)
  1987.                     ->gproc:=data.gfunc.proc()
  1988.                     ->bproc:=data.bfunc.proc()
  1989.                     /*allocate memory for a block, if necessary (cgx optimisation)*/
  1990.                     IF cybergfxbase THEN
  1991.                         NEW data.line[data.width*(data.rupd+2)]
  1992.  
  1993.                 CASE STC_PAUSE
  1994.                     worktodo:= FALSE
  1995.                 CASE STC_RESTART -> Deactivate pause
  1996.                     worktodo:=TRUE
  1997.                 ENDSELECT
  1998.                 /*
  1999.                 ** If we received a shutdown message, we do not reply it
  2000.                 ** immediately. First, we need to free our resources.
  2001.                 */
  2002.                 IF (running=FALSE) THEN JUMP exit
  2003.                 ReplyMsg(stm.stm_Message)
  2004.             ENDWHILE
  2005.             IF (worktodo)
  2006.                 /* if there is work to do, i.e. if the rendering is not
  2007.                    finished yet, we calculate the next line and draw
  2008.                    it to the offscreen rastport.*/
  2009.                 ObtainSemaphore(data.sema)
  2010.  
  2011.                 ->rproc(-1,y,lr,data.rfunc) /*precalculation*/
  2012.                 ->gproc(-1,y,lr,data.gfunc) /*... later :-)*/
  2013.                 ->bproc(-1,y,lr,data.bfunc)
  2014.  
  2015.                 IF data.savepixel 
  2016.                     IF cybergfxbase -> calculate here just to avoid testing twice for gfx system (...)
  2017.                         oldpixel:=ReadRGBPixel(data.rp,0,y)
  2018.                     ELSE
  2019.                         oldpixel:=Pi96ReadPixel(data.rp,0,y)
  2020.                     ENDIF
  2021.                 ENDIF
  2022.  
  2023.                 FOR x:=0 TO data.width-1
  2024.                     IF data.outputr=OUT_Integer      /*red*/
  2025. ->kputfmt('evaluating (red). x=\d and y=\d.\n',[x,y])
  2026.                         red:=data.rfunc.evaluate(x,y)
  2027. ->kputfmt('evaluation (red) done.\n',[])
  2028.                         ->red:=rproc(x,y,lr,data.rfunc)
  2029.                         red:=modt(red)
  2030.                         red:=Shl(red,16)
  2031.                     ELSEIF data.outputr=OUT_Float32
  2032.                         red:=!data.rfunc.evaluate(x,y)!
  2033.                         ->red:=!rproc(x,y,lr,data.rfunc)!
  2034.                         red:=modt(red)
  2035.                         red:=Shl(red,16)
  2036.                     /*ELSEIF data.outputr=OUT_Float64
  2037.                         rproc(x,y,lr,data.rfunc)
  2038.                         red:=dFix(lr)
  2039.                         red:=modt(red)
  2040.                         red:=Shl(red,16)*/
  2041.                     ELSEIF data.outputr=OUT_OldR
  2042.                         red:=oldpixel AND $FF0000
  2043.                         red:=$FF0000
  2044.                     ELSEIF data.outputr=OUT_OldG
  2045.                         red:=Shl(oldpixel AND $FF00,8)
  2046.                     ELSE /*IF data.outputr=OUT_OldB*/
  2047.                         red:=Shl(oldpixel AND $FF,16)
  2048.                     ENDIF
  2049.                     IF data.outputg=OUT_Integer      /*green*/
  2050.                         green:=data.gfunc.evaluate(x,y)
  2051.                         ->green:=gproc(x,y,lr,data.gfunc)
  2052.                         green:=modt(green)
  2053.                         green:=Shl(green,8)
  2054.                     ELSEIF data.outputg=OUT_Float32
  2055.                         green:=!data.gfunc.evaluate(x,y)!
  2056.                         ->green:=!gproc(x,y,lr,data.gfunc)!
  2057.                         green:=modt(green)
  2058.                         green:=Shl(green,8)
  2059.                     /*ELSEIF data.outputg=OUT_Float64
  2060.                         gproc(x,y,lr,data.gfunc)
  2061.                         green:=dFix(lr)
  2062.                         green:=modt(green)
  2063.                         green:=Shl(green,8)*/
  2064.                     ELSEIF data.outputg=OUT_OldR
  2065.                         green:=oldpixel AND $FF0000
  2066.                         green:=Shr(green,8)
  2067.                     ELSEIF data.outputg=OUT_OldG
  2068.                         green:=oldpixel AND $FF00
  2069.                     ELSEIF data.outputg=OUT_OldB
  2070.                         green:=oldpixel AND $FF
  2071.                         green:=Shl(green,8)
  2072.                     ELSE /*IF data.outputr=OUT_CopyR*/
  2073.                         green:=Shr(red,8)
  2074.                     ENDIF
  2075.                     IF data.outputb=OUT_Integer      /*blue*/
  2076.                         blue:=data.bfunc.evaluate(x,y)
  2077.                         ->blue:=bproc(x,y,lr,data.bfunc)
  2078.                         blue:=modt(blue)
  2079.                     ELSEIF data.outputb=OUT_Float32
  2080.                         blue:=!data.bfunc.evaluate(x,y)!
  2081.                         ->blue:=!bproc(x,y,lr,data.bfunc)!
  2082.                         blue:=modt(blue)
  2083.                     /*ELSEIF data.outputb=OUT_Float64
  2084.                         bproc(x,y,lr,data.bfunc)
  2085.                         blue:=dFix(lr)
  2086.                         blue:=modt(blue)*/
  2087.                     ELSEIF data.outputb=OUT_OldR
  2088.                         blue:=Shr(oldpixel,16)
  2089.                     ELSEIF data.outputb=OUT_OldG
  2090.                         blue:=Shr(oldpixel,8) AND $FF
  2091.                         blue:=blue AND $FF
  2092.                     ELSEIF data.outputb=OUT_OldB
  2093.                         blue:=oldpixel AND $FF
  2094.                     ELSEIF data.outputb=OUT_CopyR
  2095.                         blue:=Shr(red,16)
  2096.                     ELSE /*IF data.outputb=OUT_CopyG*/
  2097.                         blue:=Shr(green,8)
  2098.                     ENDIF
  2099.  
  2100.                     IF cybergfxbase
  2101.                         ->WriteRGBPixel(data.rp,x,y,red+green+blue)
  2102.                         data.line[i]:=red+green+blue
  2103.                         i++
  2104.                         IF data.savepixel THEN                    -> mmh, what if x is on the right border?
  2105.                             oldpixel:=ReadRGBPixel(data.rp,x+1,y)
  2106.                     ELSE
  2107.                         Pi96WritePixel(data.rp,x,y,red+green+blue)
  2108.                         IF data.savepixel THEN
  2109.                             oldpixel:=Pi96ReadPixel(data.rp,x+1,y)
  2110.  
  2111.                     ENDIF
  2112.                 ENDFOR
  2113.                 IF pi96base THEN data.calculated:=y -> that block optimisation isn't available for p96 yet...
  2114.                 ReleaseSemaphore(data.sema)
  2115.                 ObtainSemaphore(data.sema)
  2116.                 /*
  2117.                 ** after the line is finished, we set the corresponding
  2118.                 ** flag in the line update array to FALSE. This shows the
  2119.                 ** main task that this line needs to be redrawn the next
  2120.                 ** time it gets the chance.
  2121.                 */
  2122.                 IF data.rupd
  2123.                     IF cnt=0
  2124.                         IF (data.app)
  2125.                             IF cybergfxbase
  2126.                                 WritePixelArray(data.line,0,0,data.width*4,data.rp,0,data.calculated+1,data.width,data.rupd+1,RECTFMT_ARGB)
  2127.                                 data.calculated:=y
  2128.                                 i:=0
  2129.                             ENDIF
  2130.                             doMethodA(data.app,[MUIM_Application_PushMethod,data.self,1,MUIM_PlaneFunc_Update])
  2131.                         ENDIF
  2132.                         cnt:=data.rupd
  2133.                     ELSE ; cnt--
  2134.                     ENDIF
  2135.                 ENDIF
  2136.                 ReleaseSemaphore(data.sema)
  2137.                 y++
  2138.                 IF (y=data.height) -> y has already been incremented !!!
  2139.                     /* check if we are finished to draw our picture */
  2140.                      worktodo:= FALSE
  2141.                     /*if we're finished, we ask the main task to exit ourselves..*/
  2142.                     IF (data.app)
  2143.                         IF cybergfxbase
  2144.                             WritePixelArray(data.line,0,0,data.width*4,data.rp,0,data.calculated+1,data.width,data.rupd-cnt+1,RECTFMT_ARGB)
  2145.                             data.calculated:=y
  2146.                         ENDIF
  2147.  
  2148.                         doMethodA(data.app,[MUIM_Application_PushMethod,data.self,1,MUIM_PlaneFunc_Update])
  2149.                         doMethodA(data.app,[MUIM_Application_PushMethod,data.self,2,MUIM_PlaneFunc_Abort,MUIV_PlaneFunc_Abort_Finish])
  2150.                     ENDIF
  2151.                 ENDIF
  2152.                 /* Since we are very busy working, we do not Wait() for signals. */
  2153.             ELSE
  2154.                 /* We have nothing to do, just sit quietly and wait for something to happen */
  2155.                 WaitPort(st.st_Port)
  2156.             ENDIF
  2157.         ENDLOOP
  2158.         END lr
  2159. exit:
  2160.         exitsubtask(st,stm)
  2161.     ENDIF
  2162. ENDPROC
  2163.  
  2164. PROC loadpicture()
  2165. DEF pic:PTR TO super_picture,file:PTR TO CHAR,tbmp:PTR TO trueBitmap
  2166. DEF st=NIL:PTR TO subtask,
  2167.     data=NIL:PTR TO planeFunc_data,
  2168.     running=TRUE,worktodo=FALSE,changedone=TRUE,
  2169.     x,y,
  2170.     stm=NIL:PTR TO subtaskmsg,
  2171.     command,i,
  2172.     cnt=0,init=2
  2173.  
  2174.     geta4()
  2175.     IF (st:= initsubtask())
  2176.         data:=st.st_Data
  2177.         LOOP
  2178.             WHILE (stm:= GetMsg(st.st_Port))
  2179.                 command:=stm.stm_Command
  2180.                 SELECT command
  2181.                 CASE STC_SHUTDOWN
  2182.                     running:= FALSE
  2183.                     IF data.line
  2184.                         END data.line[data.width*(data.rupd+1)]
  2185.                         data.line:=0
  2186.                     ENDIF
  2187.                 CASE STC_START
  2188.                     ObtainSemaphore(data.sema)
  2189.                     data.drawn:=-1
  2190.                     data.calculated:=-1
  2191.                     DateStamp(data.ds)
  2192.                     ReleaseSemaphore(data.sema)
  2193.                     worktodo:=TRUE
  2194.                     y:=0;i:=0
  2195.                     /*allocate memory for a block, if necessary (cgx optimisation)*/
  2196.                     IF cybergfxbase THEN
  2197.                         NEW data.line[data.width*(data.rupd+2)]
  2198.                 CASE STC_PAUSE
  2199.                     worktodo:= FALSE
  2200.                 CASE STC_RESTART
  2201.                     worktodo:=TRUE
  2202.                 CASE STC_CHANGEDONE
  2203.                     changedone:=TRUE
  2204.                 ENDSELECT
  2205.                 IF (running=FALSE) THEN JUMP finish
  2206.                 ReplyMsg(stm.stm_Message)
  2207.             ENDWHILE
  2208.             ->IF (running=FALSE) THEN JUMP finish
  2209.             IF worktodo AND changedone
  2210.                 IF init = 2
  2211.                     NEW pic.super_picture(TRUE)
  2212.                     file:=data.imagefile
  2213.                     IF pic.load(file) <> 0  /*And if data.app=NIL ? :-)*/
  2214.                         doMethodA(data.app,[MUIM_Application_PushMethod,data.self,2,MUIM_PlaneFunc_Abort,MUIV_PlaneFunc_Abort_NoLoad])
  2215.                         worktodo:=FALSE
  2216.                     ELSE
  2217.                         ObtainSemaphore(data.sema) /*same as above :-)*/
  2218.                         IF data.loadm=MUIV_PlaneFunc_LoadM_ChangeSize
  2219.                             doMethodA(data.app,[MUIM_Application_PushMethod,data.self,3,
  2220.                                 MUIM_Set,MUIA_PlaneFunc_Quiet,-2])
  2221.                             doMethodA(data.app,[MUIM_Application_PushMethod,data.self,3,
  2222.                                 MUIM_Set,MUIA_PlaneFunc_Width,pic.width()])
  2223.                             doMethodA(data.app,[MUIM_Application_PushMethod,data.self,3,
  2224.                                 MUIM_Set,MUIA_PlaneFunc_Height,pic.height()])
  2225.                             doMethodA(data.app,[MUIM_Application_PushMethod,data.self,3,
  2226.                                 MUIM_Set,MUIA_PlaneFunc_Quiet,FALSE])
  2227.                             changedone:=FALSE
  2228.                         ENDIF
  2229.                         doMethodA(data.app,[MUIM_Application_PushMethod,size_txt,5,MUIM_SizeTxt_Update,
  2230.                             pic.width(),pic.height(),pic.depth(),data.projectid])
  2231.                         ReleaseSemaphore(data.sema)
  2232.                     ENDIF
  2233.                     init:=1
  2234.                 ELSEIF init = 1
  2235.                     IF (tbmp:=pic.trueconv()) = NIL
  2236.                         doMethodA(data.app,[MUIM_Application_PushMethod,data.self,2,MUIM_PlaneFunc_Abort,MUIV_PlaneFunc_Abort_NoLoad])
  2237.                         worktodo:=FALSE
  2238.                     ENDIF
  2239.                     doMethodA(data.app,[MUIM_Application_PushMethod,data.self,3,MUIM_Set,MUIA_PlaneFunc_Loading,FALSE])
  2240.                     init:=0
  2241.                 ELSE
  2242.                     ObtainSemaphore(data.sema)
  2243.                     IF data.loadm=MUIV_PlaneFunc_LoadM_Scale
  2244.                         IF cybergfxbase /*cgx*/
  2245.                             FOR x:=0 TO data.width-1
  2246.                                 ->WriteRGBPixel(data.rp,x,y,tbmp.readPixel(x*pic.width()/data.width,y*pic.height()/data.height))
  2247.                                 data.line[i]:=tbmp.readPixel(x*pic.width()/data.width,y*pic.height()/data.height)
  2248.                                 i++
  2249.                             ENDFOR
  2250.                         ELSE    /*picasso*/
  2251.                             FOR x:=0 TO data.width-1
  2252.                                 Pi96WritePixel(data.rp,x,y,tbmp.readPixel(x*pic.width()/data.width,y*pic.height()/data.height))
  2253.                             ENDFOR
  2254.                             data.calculated:=y
  2255.                         ENDIF
  2256.                     ELSE
  2257.                         IF cybergfxbase /*cgx*/
  2258.                             FOR x:=0 TO data.width-1
  2259.                                 ->WriteRGBPixel(data.rp,x,y,tbmp.readPixel(Mod(x,pic.width()),Mod(y,pic.height())))
  2260.                                 data.line[i]:=tbmp.readPixel(Mod(x,pic.width()),Mod(y,pic.height()))
  2261.                                 i++
  2262.                             ENDFOR
  2263.                         ELSE    /*picasso*/
  2264.                             FOR x:=0 TO data.width-1
  2265.                                 Pi96WritePixel(data.rp,x,y,tbmp.readPixel(Mod(x,pic.width()),Mod(y,pic.height())))
  2266.                             ENDFOR
  2267.                             data.calculated:=y
  2268.                         ENDIF
  2269.                     ENDIF
  2270.                     IF data.rupd
  2271.                         IF cnt=0
  2272.                             IF (data.app)
  2273.                                 IF cybergfxbase
  2274.                                     WritePixelArray(data.line,0,0,data.width*4,data.rp,0,data.calculated+1,data.width,data.rupd+1,RECTFMT_ARGB)
  2275.                                     data.calculated:=y
  2276.                                     i:=0
  2277.                                 ENDIF
  2278.                                 doMethodA(data.app,[MUIM_Application_PushMethod,data.self,1,MUIM_PlaneFunc_Update])
  2279.                             ENDIF
  2280.                             cnt:=data.rupd
  2281.                         ELSE ; cnt--
  2282.                         ENDIF
  2283.                     ENDIF
  2284.  
  2285.                     ReleaseSemaphore(data.sema)
  2286.                     y++
  2287.                     IF (y=data.height)
  2288.                          worktodo:= FALSE
  2289.                         IF (data.app)
  2290.                             IF cybergfxbase
  2291.                                 WritePixelArray(data.line,0,0,data.width*4,data.rp,0,data.calculated+1,data.width,data.rupd-cnt+1,RECTFMT_ARGB)
  2292.                                 data.calculated:=y
  2293.                             ENDIF
  2294.                             doMethodA(data.app,[MUIM_Application_PushMethod,data.self,1,MUIM_PlaneFunc_Update])
  2295.                             doMethodA(data.app,[MUIM_Application_PushMethod,data.self,2,MUIM_PlaneFunc_Abort,MUIV_PlaneFunc_Abort_Finish])
  2296.                         ENDIF
  2297.                     ENDIF
  2298.                 ENDIF
  2299.             ELSE
  2300.                 WaitPort(st.st_Port)
  2301.             ENDIF
  2302.         ENDLOOP
  2303. finish:
  2304.         END pic
  2305.         exitsubtask(st,stm)
  2306.     ENDIF
  2307. ENDPROC
  2308. /********************************
  2309. *   Inter-referencing...        *
  2310. ********************************/
  2311.  
  2312. /*freeze(expression): this will read-lock all used functions.
  2313. returns true if success, or false if failure*/
  2314.  
  2315. PROC freeze(f:PTR TO expression)
  2316. DEF a:PTR TO planeFunc_data,b,c,data:PTR TO projectList_data,obj,lock
  2317. DEF exec_list:PTR TO lh,worknode:PTR TO project_Node
  2318.     IF f.precision > OUT_Float64 THEN RETURN TRUE
  2319.     data:=INST_DATA(cl_projectlist.mcc_class,opened_lst)
  2320.  
  2321.     a,b,c:=f.reference()
  2322.  
  2323.     IF a > 3 -> direct reference to project "a" (a is the data of the object)
  2324.             /* + sub-functions "b" and "c"*/
  2325.         /*checks that a exists, searching it in the projects list*/
  2326.         data:=INST_DATA(cl_projectlist.mcc_class,opened_lst)
  2327.         exec_list:=data.exec_list
  2328.         worknode:=exec_list.head
  2329.         WHILE wcomp(worknode,a)
  2330.             worknode:=worknode.ln.succ
  2331.         ENDWHILE
  2332.         IF worknode.ln.succ = 0 -> a doesn't exist
  2333.             RETURN FALSE
  2334.         ENDIF
  2335.         obj:=a.self
  2336.         get(obj,MUIA_PlaneFunc_Lock,{lock})
  2337.         IF lock = MUIV_PlaneFunc_Lock_Write THEN RETURN FALSE
  2338.         set(obj,MUIA_PlaneFunc_Lock,MUIV_PlaneFunc_Lock_Read)
  2339.         IF freeze(b) = 0
  2340.             set(obj,MUIA_PlaneFunc_Lock,MUIV_PlaneFunc_Lock_NoRead)
  2341.             RETURN FALSE
  2342.         ENDIF
  2343.         IF freeze(c) = 0
  2344.             free(b) -> IF "c" can't be frozen, let's free "b" before returning
  2345.             set(obj,MUIA_PlaneFunc_Lock,MUIV_PlaneFunc_Lock_NoRead)
  2346.             RETURN FALSE
  2347.         ENDIF
  2348.         RETURN TRUE
  2349.     ENDIF
  2350.  
  2351.     SELECT a
  2352.     CASE 2 -> One sub-function : "b"
  2353.         IF freeze(b) = 0 THEN RETURN FALSE
  2354.     CASE 3 -> Two sub functions : "b" and "c"
  2355.         IF freeze(b) = 0 THEN RETURN FALSE
  2356.         IF freeze(c) = 0
  2357.             free(b) -> IF "c" can't be frozen, let's free "b" before returning
  2358.             RETURN FALSE
  2359.         ENDIF
  2360.     ENDSELECT
  2361. ENDPROC TRUE
  2362.  
  2363. PROC wcomp(node:PTR TO project_Node,data)
  2364.     IF node.ln.succ = 0 THEN RETURN FALSE
  2365. ENDPROC (wdata(node.window) <> data)
  2366.  
  2367. PROC wdata(window)
  2368. DEF gad,list:PTR TO mlh,cs:PTR TO object
  2369.     get(window,MUIA_Window_RootObject,{gad})
  2370.     get(gad,MUIA_Group_ChildList,{list})
  2371.     cs:=list.head
  2372. ENDPROC INST_DATA(cl_planefunc.mcc_class,NextObject({cs}))
  2373.  
  2374. /*free(expression): This un read-locks all used functions.
  2375. It assumes that freeze(function) has been executed before and that
  2376. function did not change since*/
  2377.  
  2378. PROC free(f:PTR TO expression)
  2379. DEF a:PTR TO planeFunc_data,b,c,data:PTR TO projectList_data,obj
  2380.  
  2381.     data:=INST_DATA(cl_projectlist.mcc_class,opened_lst)
  2382.  
  2383.     a,b,c:=f.reference()
  2384.     IF a > 3
  2385.         obj:=a.self
  2386.         set(obj,MUIA_PlaneFunc_Lock,MUIV_PlaneFunc_Lock_NoRead)
  2387.         a:=3
  2388.     ENDIF
  2389.     SELECT a
  2390.     CASE 2 -> One sub-expression : "b"
  2391.         free(b)
  2392.     CASE 3 -> Two sub-expressions : "b" and "c"
  2393.         free(b)
  2394.         free(c)
  2395.     ENDSELECT
  2396. ENDPROC
  2397.  
  2398. /***************************************************************
  2399. **                       main program                         **
  2400. ****************************************************************
  2401.  Opens the libraries, creates the user interface structure and
  2402. notifications. The input loop just waits for MUI to say to quit.
  2403. ***************************************************************/
  2404.  
  2405. PROC main() HANDLE
  2406.     storea4()
  2407.     IF (localebase:=OpenLibrary('locale.library',0)) = NIL THEN
  2408.         Raise('locale.library')
  2409.     NEW cat.create()
  2410.     cat.open()
  2411.     IF (utilitybase:=OpenLibrary('utility.library',36))=NIL THEN
  2412.         Raise('utility.library') /*for tag-list parsing*/
  2413.     IF (datatypesbase:=OpenLibrary('datatypes.library',0))=NIL THEN
  2414.         Raise('datatypes.library')
  2415.     muimasterbase:=OpenLibrary(MUIMASTER_NAME,MUIMASTER_VMIN)
  2416.     IF muimasterbase = NIL THEN
  2417.         Raise('muimaster.library')
  2418.     IF (aslbase:=OpenLibrary('asl.library',37))=NIL THEN
  2419.         Raise('asl.library')
  2420.  
  2421.     dInit(TRUE)
  2422.     cl_planefunc:=eMui_CreateCustomClass(NIL,MUIC_Area ,NIL,SIZEOF planeFunc_data,{planeFunc_dispatcher})
  2423.     cl_projectlist:=eMui_CreateCustomClass(NIL,MUIC_List,NIL,SIZEOF projectList_data,{projectList_dispatcher})
  2424.     cl_uslider:=eMui_CreateCustomClass(NIL,MUIC_Slider,NIL,SIZEOF uslider_data,{uslider_dispatcher})
  2425.     cl_sizetxt:=eMui_CreateCustomClass(NIL,MUIC_Text,NIL,SIZEOF sizetxt_data,{sizetxt_dispatcher})
  2426.     cl_myapp:=eMui_CreateCustomClass(NIL,MUIC_Application,NIL,SIZEOF empty_data,{myapp_dispatcher})
  2427.     ftype_registertitles:=[cat.msgl_type_Image.getstr(),cat.msgl_type_Function.getstr(),NIL]
  2428.     size_radiolabels:=[cat.msgl_lm_Scale.getstr(),cat.msgl_lm_CutTile.getstr(),cat.msgl_lm_Change.getstr(),NIL]
  2429.     showme_cyclelabels:=[cat.msgl_Hidden.getstr(),cat.msgl_Shown.getstr(),NIL]
  2430.  
  2431.     FOR app:=0 TO 14 -> app: I did not want to create a var just for that loop :-)
  2432.         messages[app]:=String(100)
  2433.     ENDFOR
  2434.  
  2435.     app:=MyApplicationObject,
  2436.         MUIA_Application_Title, 'picFX',
  2437.         MUIA_Application_Version,FULLVERSION,
  2438.         MUIA_Application_Author, 'Maxime Gamboni',
  2439.         MUIA_Application_Description, cat.msg_Description.getstr(),
  2440.         MUIA_Application_Base,'picFX',
  2441.  
  2442.         SubWindow, settings_win:=WindowObject,
  2443.             MUIA_Window_Title, cat.msgl_Title.getstr(),
  2444.             MUIA_Window_ScreenTitle, PICVERSION,
  2445.             MUIA_Window_ID,"SETT",
  2446.             WindowContents,HGroup,
  2447.                 Child, VGroup,
  2448.                     MUIA_Weight,30,
  2449.                     Child, TextObject,
  2450.                         NoFrame,
  2451.                         MUIA_Text_PreParse,'\ec',
  2452.                         MUIA_Text_Contents,cat.msgl_OpenedProjects.getstr(),
  2453.                     End,
  2454.                     Child, opened_lsv:=ListviewObject,
  2455.                         InputListFrame,
  2456.                         MUIA_Listview_List,opened_lst:=ProjectListObject,End,
  2457.                     End,
  2458.                     Child, new_btn:=SimpleButton(cat.msgl_New.getstr()),
  2459.                     Child, RectangleObject,MUIA_Rectangle_HBar,MUI_TRUE,MUIA_Weight,0,End,
  2460.                     Child, prefs_btn:=TextObject,
  2461.                         ButtonFrame,
  2462.                         MUIA_Background,MUII_ButtonBack,
  2463.                         MUIA_Text_PreParse,'\ec',
  2464.                         MUIA_Text_Contents,cat.msgl_Prefs.getstr(),
  2465.                         MUIA_InputMode,MUIV_InputMode_RelVerify,
  2466.                     End,
  2467.                 End,
  2468.                 Child, RectangleObject,MUIA_Rectangle_VBar,MUI_TRUE,MUIA_Weight,0,End,
  2469.                 Child, sgroup:=VGroup,
  2470.                     MUIA_Disabled,MUI_TRUE, -> No projects are opened at beginning
  2471.                     Child,name_str:= StringObject,MUIA_String_Contents,cat.msg_Unnamed.getstr(),StringFrame,End,
  2472.                     Child, type_reg:=RegisterGroup(ftype_registertitles),
  2473.                         Child, VGroup,
  2474.                             Child, HGroup,
  2475.                                 Child, FreeLabel(cat.msgl_Path.getstr()),
  2476.                                 Child, PopaslObject,
  2477.                                     MUIA_Popstring_Button,PopButton(MUII_PopFile),
  2478.                                     MUIA_Popasl_Type,ASL_FILEREQUEST,
  2479.                                     MUIA_Popstring_String,path_str:=StringObject,
  2480.                                         StringFrame,
  2481.                                         MUIA_String_Contents,cat.msg_Unnamed.getstr(),
  2482.                                     End,
  2483.                                 End,
  2484.                             End,
  2485.                             Child, HGroup,
  2486.                                 Child, size_rad:=RadioObject,
  2487.                                     GroupFrameT(cat.msgl_Size.getstr()),
  2488.                                     MUIA_Radio_Entries,size_radiolabels,
  2489.                                     MUIA_Radio_Active,1,
  2490.                                 End,
  2491.                                 Child, VGroup,
  2492.                                     Child, RectangleObject,End,
  2493.                                     Child, size_txt:=SizeTextObject,
  2494.                                         TextFrame,
  2495.                                         MUIA_Text_PreParse,'\ec',
  2496.                                         MUIA_Text_Contents,cat.msgl_PicSize.getstr(),
  2497.                                     End,
  2498.                                     Child, RectangleObject,End,
  2499.                                 End,
  2500.                             End,
  2501.                         End,
  2502.                         Child, VGroup,
  2503.                             Child, HGroup,
  2504.                                 Child,red_fail:=LampObject,
  2505.                                     MUIA_Lamp_Type,MUIV_Lamp_Type_Big,
  2506.                                     MUIA_Lamp_ColorType,MUIV_Lamp_ColorType_UserDefined,
  2507.                                     MUIA_Lamp_Color,MUIV_Lamp_Color_Ok,
  2508.                                 End,
  2509.                                 Child, r_lbl:=label('r(#,x,y)='),
  2510.                                 Child, red_str:=StringObject,
  2511.                                     StringFrame,
  2512.                                 End,
  2513.                             End,
  2514.                             Child, HGroup,
  2515.                                 Child, Label(cat.msgl_Output.getstr()),
  2516.                                 Child, outr_cyc:=CycleObject,
  2517.                                     MUIA_Cycle_Entries,[cat.msgl_Int32.getstr(),cat.msgl_Float32.getstr(),cat.msgl_Float64.getstr(),
  2518.                                                         cat.msgl_OldR.getstr(),cat.msgl_OldG.getstr(),cat.msgl_OldB.getstr(),NIL],
  2519.                                     MUIA_Cycle_Active,3,
  2520.                                 End,
  2521.                                 Child, RectangleObject,End,
  2522.                                 Child,CycleObject,
  2523.                                     MUIA_Cycle_Entries,['Not compiled','Compiled now','Always compile',NIL],
  2524.                                 End,
  2525.                             End,
  2526.  
  2527.                             Child, HGroup,
  2528.                                 Child,green_fail:=LampObject,
  2529.                                     MUIA_Lamp_Type,MUIV_Lamp_Type_Big,
  2530.                                     MUIA_Lamp_ColorType,MUIV_Lamp_ColorType_UserDefined,
  2531.                                     MUIA_Lamp_Color,MUIV_Lamp_Color_Ok,
  2532.                                 End,
  2533.                                 Child, g_lbl:=label('g(#,x,y)='),
  2534.                                 Child, green_str:=StringObject,
  2535.                                     StringFrame,
  2536.                                 End,
  2537.                             End,
  2538.                             Child, HGroup,
  2539.                                 Child, Label(cat.msgl_Output.getstr()),
  2540.                                 Child, outg_cyc:=CycleObject,
  2541.                                     MUIA_Cycle_Entries,[cat.msgl_Int32.getstr(),cat.msgl_Float32.getstr(),cat.msgl_Float64.getstr(),
  2542.                                                         cat.msgl_OldR.getstr(),cat.msgl_OldG.getstr(),cat.msgl_OldB.getstr(),
  2543.                                                         cat.msgl_CopyR.getstr(),NIL],
  2544.                                     MUIA_Cycle_Active,3,
  2545.                                 End,
  2546.                                 Child, RectangleObject,End,
  2547.                                 Child,CycleObject,
  2548.                                     MUIA_Cycle_Entries,['Not compiled','Compiled now','Always compile',NIL],
  2549.                                 End,
  2550.                             End,
  2551.  
  2552.                             Child, HGroup,
  2553.                                 Child,blue_fail:=LampObject,
  2554.                                     MUIA_Lamp_Type,MUIV_Lamp_Type_Big,
  2555.                                     MUIA_Lamp_ColorType,MUIV_Lamp_ColorType_UserDefined,
  2556.                                     MUIA_Lamp_Color,MUIV_Lamp_Color_Ok,
  2557.                                 End,
  2558.                                 Child, b_lbl:=label('b(#,x,y)='),
  2559.                                 Child, blue_str:=StringObject,
  2560.                                     StringFrame,
  2561.                                 End,
  2562.                             End,
  2563.                             Child, HGroup,
  2564.                                 Child, Label(cat.msgl_Output.getstr()),
  2565.                                 Child, outb_cyc:=CycleObject,
  2566.                                     MUIA_Cycle_Entries,[cat.msgl_Int32.getstr(),cat.msgl_Float32.getstr(),cat.msgl_Float64.getstr(),
  2567.                                                         cat.msgl_OldR.getstr(),cat.msgl_OldG.getstr(),cat.msgl_OldB.getstr(),
  2568.                                                         cat.msgl_CopyR.getstr(),cat.msgl_CopyG.getstr(),NIL],
  2569.                                     MUIA_Cycle_Active,3,
  2570.                                 End,
  2571.                                 Child, RectangleObject,End,
  2572.                                 Child,CycleObject,
  2573.                                     MUIA_Cycle_Entries,['Not compiled','Compiled now','Always compile',NIL],
  2574.                                 End,
  2575.                             End,
  2576.                         End,
  2577.                     End,
  2578.                     Child, HGroup,
  2579.                         Child, TextObject,
  2580.                             MUIA_Text_PreParse,'\ec',
  2581.                             MUIA_Text_Contents,cat.msgl_Width.getstr(),
  2582.                         End,
  2583.                         Child, TextObject,
  2584.                             MUIA_Text_PreParse,'\ec',
  2585.                             MUIA_Text_Contents,cat.msgl_Height.getstr(),
  2586.                         End,
  2587.                     End,
  2588.                     Child, HGroup,
  2589.                         Child, width_str:=StringObject,
  2590.                             StringFrame,
  2591.                             MUIA_String_Accept,'0123456789',
  2592.                         End,
  2593.                         Child, height_str:=StringObject,
  2594.                             StringFrame,
  2595.                             MUIA_String_Accept,'0123456789',
  2596.                         End,
  2597.                     End,
  2598.                     Child, GroupObject,MUIA_Group_Rows,2,
  2599.                         Child, draw_btn:=TextObject,
  2600.                             ButtonFrame,
  2601.                             MUIA_Background,MUII_ButtonBack,
  2602.                             MUIA_Text_PreParse,'\ec',
  2603.                             MUIA_Text_Contents,cat.msgl_Render.getstr(),
  2604.                             MUIA_InputMode,MUIV_InputMode_RelVerify,
  2605.                         End,
  2606.                         Child, savepic_btn:=SimpleButton(cat.msgl_SavePic.getstr()),
  2607.                         Child, savefunc_btn:=SimpleButton(cat.msgl_SaveFunc.getstr()),
  2608.                         Child, abort_btn:=SimpleButton(cat.msgl_Abort.getstr()),
  2609.                         Child, showme_cyc:=CycleObject,
  2610.                             ButtonFrame,
  2611.                             MUIA_Cycle_Entries,showme_cyclelabels,
  2612.                             MUIA_Cycle_Active,1,
  2613.                         End,
  2614.                         Child, close_btn:=SimpleButton(cat.msgl_Close.getstr()),
  2615.                         Child, loadfunc_btn:=SimpleButton(cat.msgl_LoadFunc.getstr()),
  2616.                         Child, clear_btn:=SimpleButton(cat.msgl_Clear.getstr()),
  2617.                     End,
  2618.                     Child, HGroup,
  2619.                         Child,lamp_lmp:=LampObject,
  2620.                             MUIA_Lamp_Type,MUIV_Lamp_Type_Big,
  2621.                             MUIA_Lamp_ColorType,MUIV_Lamp_ColorType_UserDefined,
  2622.                             MUIA_Lamp_Color,MUIV_Lamp_Color_Off,
  2623.                         End,
  2624.                         Child,state_txt:=TextObject,
  2625.                             MUIA_Text_Contents,cat.msgs_Idle.getstr(),
  2626.                             MUIA_Weight,50,
  2627.                         End,
  2628.                         Child,state_gau:=GaugeObject,
  2629.                             TextFrame,
  2630.                             MUIA_Gauge_Horiz , MUI_TRUE,
  2631.                         End,
  2632.                     End,
  2633.                 End,
  2634.             End,
  2635.         End,
  2636.         SubWindow,prefs_win:=SettingsWindowObject,
  2637.             MUIA_Window_Title,cat.msgl_Prefs.getstr(),
  2638.             MUIA_Window_ID,"PREF",
  2639.             WindowContents,HGroup,
  2640.                 Child, VGroup,
  2641.                     GroupFrameT(cat.msgp_Priority.getstr()),
  2642.                     Child, mainpri_sld:=uSliderObject,
  2643.                         GroupFrameT(cat.msgp_MainTask.getstr()),
  2644.                         MUIA_Slider_Min,-10,
  2645.                         MUIA_Slider_Max,10,
  2646.                         MUIA_Slider_Level,0,
  2647.                     End,
  2648.                     Child, currpri_sld:=uSliderObject,
  2649.                         GroupFrameT(cat.msgp_CurrentTask.getstr()),
  2650.                         MUIA_Slider_Min,-10,
  2651.                         MUIA_Slider_Max,10,
  2652.                         MUIA_Slider_Level,-1,
  2653.                     End,
  2654.                     Child, renderpri_sld:=uSliderObject,
  2655.                         GroupFrameT(cat.msgp_RenderTask.getstr()),
  2656.                         MUIA_Slider_Min,-10,
  2657.                         MUIA_Slider_Max,10,
  2658.                         MUIA_Slider_Level,-2,
  2659.                     End,
  2660.                 End,
  2661.                 Child, VGroup,
  2662.                     Child, renderupdate_sld:=uSliderObject,
  2663.                         GroupFrameT(cat.msgp_RenderUpd.getstr()),
  2664.                         MUIA_uSlider_Stringify,MUI_TRUE,
  2665.                         MUIA_Slider_Min,0,
  2666.                         MUIA_Slider_Max,40,
  2667.                         MUIA_Slider_Level,10,
  2668.                     End,
  2669.                     Child, HGroup,
  2670.                         Child, FreeLabel(cat.msgp_Close.getstr()),
  2671.                         Child, close_cyc:=CycleObject,
  2672.                             MUIA_Cycle_Entries,[cat.msgl_Iconify.getstr(),cat.msgl_Close.getstr(),NIL],
  2673.                             MUIA_Cycle_Active,0,
  2674.                         End,
  2675.                     End,
  2676.                     Child, mui_btn:=SimpleButton(cat.msgp_MuiPrefs.getstr()),
  2677.                 End,
  2678.             End,
  2679.         End,
  2680.         SubWindow,messages_win:=WindowObject,
  2681.             MUIA_Window_Title,cat.msgm_NoMsg.getstr(),
  2682.             MUIA_Window_ID,"MESS",
  2683.             WindowContents,VGroup,
  2684.                 Child,ListviewObject,
  2685.                     MUIA_Listview_Input,FALSE,
  2686.                     ReadListFrame,
  2687.                     MUIA_Listview_List,messages_lst:=ListObject,
  2688.                         MUIA_List_SourceArray,messages,
  2689.                     End,
  2690.                 End,
  2691.                 Child, colour_txt:=TextObject,
  2692.                     TextFrame,
  2693.                     MUIA_Background,MUII_TextBack,
  2694.                     MUIA_Text_Contents,'c(p,x,y)=[r,g,b]',
  2695.                 End,
  2696.             End,
  2697.         End,
  2698.     End
  2699.     IF app <> NIL
  2700.         set(settings_win,MUIA_Window_DefaultObject,opened_lsv)
  2701.  
  2702.         doMethodA(settings_win,[MUIM_Notify,MUIA_Window_CloseRequest,MUI_TRUE,app,2,MUIM_Application_ReturnID,MUIV_Application_ReturnID_Quit])
  2703.         doMethodA(new_btn,     [MUIM_Notify,MUIA_Pressed,FALSE,opened_lst,1,MUIM_ProjectList_NewItem])
  2704. /*preferences*/
  2705.         set(prefs_btn,MUIA_Disabled,MUI_TRUE)
  2706. /*        doMethodA(prefs_btn,   [MUIM_Notify,MUIA_Pressed,FALSE,prefs_win,3,MUIM_Set,MUIA_Window_Open,MUI_TRUE])
  2707.         doMethodA(mui_btn,     [MUIM_Notify,MUIA_Pressed,FALSE,app,1,MUIM_Application_OpenConfigWindow])
  2708.  
  2709.         doMethodA(prefs_win,   [MUIM_SettingsWindow_Notify,SETID_MainP,  MUIV_EveryTime,opened_lst,3,MUIM_ProjectList_SetPri,MUIV_ProjectList_SetPri_Main,MUIV_TriggerValue])
  2710.         doMethodA(prefs_win,   [MUIM_SettingsWindow_Notify,SETID_RenderP,MUIV_EveryTime,opened_lst,3,MUIM_ProjectList_SetPri,MUIV_ProjectList_SetPri_Render,MUIV_TriggerValue])
  2711.         doMethodA(prefs_win,   [MUIM_SettingsWindow_Notify,SETID_CurrP,  MUIV_EveryTime,opened_lst,3,MUIM_ProjectList_SetPri,MUIV_ProjectList_SetPri_Curr,MUIV_TriggerValue])
  2712.         doMethodA(prefs_win,   [MUIM_SettingsWindow_Notify,SETID_RUpd,   MUIV_EveryTime,opened_lst,3,MUIM_ProjectList_Prefs,{rupd},MUIV_TriggerValue])
  2713.         doMethodA(prefs_win,   [MUIM_SettingsWindow_Notify,SETID_Close,  MUIV_EveryTime,app,3,MUIM_WriteLong,MUIV_TriggerValue,{wclose}])*/
  2714. /*        doMethodA(prefs_win,[MUIM_SettingsWindow_Init,
  2715.             mainpri_sld,     MUIA_Slider_Level,SWIT_STANDARD,0,SETID_MainP,
  2716.             renderpri_sld,   MUIA_Slider_Level,SWIT_STANDARD,0,SETID_RenderP,
  2717.             currpri_sld,     MUIA_Slider_Level,SWIT_STANDARD,0,SETID_CurrP,
  2718.             renderupdate_sld,MUIA_Slider_Level,SWIT_STANDARD,0,SETID_RUpd,
  2719.             close_cyc,       MUIA_Cycle_Active,SWIT_STANDARD,0,SETID_Close,
  2720.             NIL])*/
  2721.  
  2722. /*mainpri >= currpri >= renderpri*/
  2723.         doMethodA(mainpri_sld,[MUIM_Notify,MUIA_Slider_Level,MUIV_EveryTime,currpri_sld,2,MUIM_uSlider_Smaller,MUIV_TriggerValue])
  2724.         doMethodA(mainpri_sld,[MUIM_Notify,MUIA_Slider_Level,MUIV_EveryTime,renderpri_sld,2,MUIM_uSlider_Smaller,MUIV_TriggerValue])
  2725.  
  2726.         doMethodA(currpri_sld,[MUIM_Notify,MUIA_Slider_Level,MUIV_EveryTime,renderpri_sld,2,MUIM_uSlider_Smaller,MUIV_TriggerValue])
  2727.         doMethodA(currpri_sld,[MUIM_Notify,MUIA_Slider_Level,MUIV_EveryTime,mainpri_sld,2,MUIM_uSlider_Bigger,MUIV_TriggerValue])
  2728.  
  2729.         doMethodA(renderpri_sld,[MUIM_Notify,MUIA_Slider_Level,MUIV_EveryTime,mainpri_sld,2,MUIM_uSlider_Bigger,MUIV_TriggerValue])
  2730.         doMethodA(renderpri_sld,[MUIM_Notify,MUIA_Slider_Level,MUIV_EveryTime,currpri_sld,2,MUIM_uSlider_Bigger,MUIV_TriggerValue])
  2731.  
  2732. /*Every change to a gadget is sent to the ProjectList class*/
  2733.         doMethodA(name_str,    [MUIM_Notify,MUIA_String_Contents,MUIV_EveryTime,opened_lst,3,MUIM_ProjectList_Notify,MUIV_ProjectList_Notify_Name,MUIV_TriggerValue])
  2734.         doMethodA(type_reg,    [MUIM_Notify,MUIA_Group_ActivePage,MUIV_EveryTime,opened_lst,3,MUIM_ProjectList_Notify,MUIV_ProjectList_Notify_Type,MUIV_TriggerValue])
  2735.         doMethodA(path_str,    [MUIM_Notify,MUIA_String_Contents,MUIV_EveryTime,opened_lst,3,MUIM_ProjectList_Notify,MUIV_ProjectList_Notify_ImageFile,MUIV_TriggerValue])
  2736.         doMethodA(size_rad,    [MUIM_Notify,MUIA_Radio_Active,MUIV_EveryTime,opened_lst,3,MUIM_ProjectList_Notify,MUIV_ProjectList_Notify_LoadM,MUIV_TriggerValue])
  2737.         doMethodA(red_str,     [MUIM_Notify,MUIA_String_Acknowledge,MUIV_EveryTime,opened_lst,3,MUIM_ProjectList_Notify,MUIV_ProjectList_Notify_Red,MUIV_TriggerValue])
  2738.         doMethodA(green_str,   [MUIM_Notify,MUIA_String_Acknowledge,MUIV_EveryTime,opened_lst,3,MUIM_ProjectList_Notify,MUIV_ProjectList_Notify_Green,MUIV_TriggerValue])
  2739.         doMethodA(blue_str,    [MUIM_Notify,MUIA_String_Acknowledge,MUIV_EveryTime,opened_lst,3,MUIM_ProjectList_Notify,MUIV_ProjectList_Notify_Blue,MUIV_TriggerValue])
  2740.         doMethodA(outr_cyc,    [MUIM_Notify,MUIA_Cycle_Active,MUIV_EveryTime,opened_lst,3,MUIM_ProjectList_Notify,MUIV_ProjectList_Notify_OutputR,MUIV_TriggerValue])
  2741.         doMethodA(outg_cyc,    [MUIM_Notify,MUIA_Cycle_Active,MUIV_EveryTime,opened_lst,3,MUIM_ProjectList_Notify,MUIV_ProjectList_Notify_OutputG,MUIV_TriggerValue])
  2742.         doMethodA(outb_cyc,    [MUIM_Notify,MUIA_Cycle_Active,MUIV_EveryTime,opened_lst,3,MUIM_ProjectList_Notify,MUIV_ProjectList_Notify_OutputB,MUIV_TriggerValue])
  2743.         doMethodA(width_str,   [MUIM_Notify,MUIA_String_Acknowledge,MUIV_EveryTime,opened_lst,3,MUIM_ProjectList_Notify,MUIV_ProjectList_Notify_Width,MUIV_TriggerValue])
  2744.         doMethodA(height_str,  [MUIM_Notify,MUIA_String_Acknowledge,MUIV_EveryTime,opened_lst,3,MUIM_ProjectList_Notify,MUIV_ProjectList_Notify_Height,MUIV_TriggerValue])
  2745. /*If the active element of the Opened Projects List has changed, the gadgets must be refreshed*/
  2746.         doMethodA(opened_lst,  [MUIM_Notify,MUIA_List_Active,MUIV_EveryTime,opened_lst,1,MUIM_ProjectList_Refresh,0])
  2747. /*Action buttons:ProjectList class will forward those messages to the selected project*/
  2748.         doMethodA(draw_btn,    [MUIM_Notify,MUIA_Pressed,FALSE,opened_lst,2,MUIM_ProjectList_Forward,MUIM_PlaneFunc_Render])
  2749.         doMethodA(savepic_btn, [MUIM_Notify,MUIA_Pressed,FALSE,opened_lst,2,MUIM_ProjectList_Forward,MUIM_PlaneFunc_SavePic])
  2750.         doMethodA(savefunc_btn,[MUIM_Notify,MUIA_Pressed,FALSE,opened_lst,2,MUIM_ProjectList_Forward,MUIM_PlaneFunc_SaveFunc])
  2751.         doMethodA(loadfunc_btn,[MUIM_Notify,MUIA_Pressed,FALSE,opened_lst,2,MUIM_ProjectList_Forward,MUIM_PlaneFunc_LoadFunc])
  2752.         doMethodA(abort_btn,   [MUIM_Notify,MUIA_Pressed,FALSE,opened_lst,2,MUIM_ProjectList_Forward,MUIM_PlaneFunc_Abort])
  2753.         doMethodA(clear_btn,   [MUIM_Notify,MUIA_Pressed,FALSE,opened_lst,2,MUIM_ProjectList_Forward,MUIM_PlaneFunc_Clear])
  2754. /*since the address of the current project is variable I can't do direct notification. Instead, there are two methods for ProjectList.*/
  2755.         doMethodA(opened_lsv,  [MUIM_Notify,MUIA_Listview_DoubleClick,MUI_TRUE,showme_cyc,3,MUIM_Set,MUIA_Cycle_Active,1])
  2756.         doMethodA(showme_cyc,  [MUIM_Notify,MUIA_Cycle_Active,MUIV_EveryTime,opened_lst,2,MUIM_ProjectList_ShowMe,MUIV_TriggerValue])
  2757.         doMethodA(close_btn,   [MUIM_Notify,MUIA_Pressed,FALSE,opened_lst,1,MUIM_ProjectList_DelItem])
  2758.  
  2759.         set(settings_win,MUIA_Window_Open,MUI_TRUE)
  2760.         set(messages_win,MUIA_Window_Open,MUI_TRUE)
  2761.  
  2762.         message(-1,cat.msgm_Welcome.getstr())
  2763.  
  2764.         WHILE Not(doMethodA(app,[MUIM_Application_NewInput,{sigs}]) = MUIV_Application_ReturnID_Quit)
  2765.             IF sigs THEN sigs := Wait(sigs)
  2766.         ENDWHILE
  2767.  
  2768.     ELSE
  2769.         WriteF(cat.msg_NoApp.getstr())
  2770.     ENDIF
  2771. EXCEPT DO
  2772.     IF app THEN Mui_DisposeObject(app)
  2773.     IF cl_planefunc THEN Mui_DeleteCustomClass(cl_planefunc)
  2774.     IF cl_projectlist THEN Mui_DeleteCustomClass(cl_projectlist)
  2775.     IF cl_uslider THEN Mui_DeleteCustomClass(cl_uslider)
  2776.     IF cl_sizetxt THEN Mui_DeleteCustomClass(cl_sizetxt)
  2777.     IF cl_myapp THEN Mui_DeleteCustomClass(cl_myapp)
  2778.     dCleanup()
  2779.     cleanfuncs()
  2780.     IF exception
  2781.         IF localebase
  2782.             WriteF(cat.msg_Nolib.getstr(),exception)
  2783.         ELSE
  2784.             WriteF('Failed to open \s.\n',exception)
  2785.         ENDIF
  2786.     ENDIF
  2787.     IF cybergfxbase  THEN CloseLibrary(cybergfxbase)
  2788.     IF datatypesbase THEN CloseLibrary(datatypesbase)
  2789.     IF muimasterbase THEN CloseLibrary(muimasterbase)
  2790.     IF pi96base      THEN CloseLibrary(pi96base)
  2791.     IF utilitybase   THEN CloseLibrary(utilitybase)
  2792.     cat.close()
  2793.     IF localebase THEN CloseLibrary(localebase)
  2794. ENDPROC                     
  2795.  
  2796. PROC message(id,info:PTR TO CHAR) -> Writes a message in the message-list
  2797. DEF t
  2798.     FOR t:=0 TO 13
  2799.         StrCopy(messages[t],messages[t+1]) -> Warning, the addresses mustn't change!
  2800.     ENDFOR
  2801.     StringF(messages[14],'[\d] \s',id,info)
  2802.     doMethodA(messages_lst,[MUIM_List_Redraw,MUIV_List_Redraw_All])
  2803.     StringF(title,'\d Message\c',counter++,-(counter<>2)*"s")     /*I will have to localize this, too!*/
  2804.     set(messages_win,MUIA_Window_Title,title)
  2805. ENDPROC
  2806.  
  2807. PROC messagefmt(id,info:PTR TO CHAR,arg1=0,arg2=0,arg3=0)
  2808. DEF s[100]:STRING
  2809.     StringF(s,info,arg1,arg2,arg3)
  2810.     message(id,s)
  2811. ENDPROC
  2812.  
  2813. /* geta4.e © Leon Woestenberg */
  2814.  
  2815. PROC storea4()
  2816.   LEA a4storage(PC),A0
  2817.   MOVE.L A4,(A0)
  2818. ENDPROC
  2819.  
  2820. PROC geta4()
  2821.   LEA a4storage(PC),A0
  2822.   MOVE.L (A0),A4
  2823. ENDPROC
  2824.  
  2825. a4storage:
  2826.   LONG NIL                 
  2827.